Cara menyampaikan beberapa parameter ke kaedah pengawal API Web

Dalam catatan terdahulu di sini, kami meneroka pengikatan parameter di API Web. Dalam catatan ini, kita akan belajar bagaimana meneruskan beberapa parameter ke kaedah pengawal API Web.

API Web menyediakan kaedah tindakan yang diperlukan untuk operasi HTTP GET, POST, PUT, dan DELETE. Anda biasanya akan meneruskan satu objek sebagai parameter kepada kaedah tindakan PUT dan POST. Perhatikan bahawa API Web tidak menyokong meneruskan beberapa parameter POST ke kaedah pengawal API Web secara lalai. Tetapi bagaimana jika anda membuat permintaan POST dengan beberapa objek dilewatkan sebagai parameter ke kaedah pengawal API Web?

Memahami masalah

API Web tidak membenarkan anda melepasi banyak objek kompleks dalam kaedah tandatangan kaedah pengawal API Web - anda boleh menghantar hanya satu nilai ke kaedah tindakan API Web. Nilai ini pada gilirannya boleh menjadi objek yang kompleks. Adalah mungkin untuk melewati beberapa nilai walaupun pada operasi POST atau PUT dengan memetakan satu parameter ke kandungan sebenarnya dan yang selebihnya melalui rentetan pertanyaan.

Kelas pengawal berikut mengandungi kaedah POST bernama Save yang menerima pelbagai parameter.

kelas awam AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int Id, string FirstName, string LastName, string Alamat)

        {

            // Kod biasa

            kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

        }

   }

Sekarang andaikan anda cuba memanggil kaedah pengawal API Web dari JQuery seperti yang ditunjukkan di bawah.

$ .ajax ({

 url: 'api / pengarang',

 taip: 'POST',

 data: {Id: 1, FirstName: 'Joydip', LastName: 'Kanjilal', Alamat: 'Hyderabad'},

 dataType: 'json',

 kejayaan: fungsi (data) {

amaran (data);

}});

Sayangnya, panggilan ini akan gagal kerana permintaan ini tidak dapat diproses oleh API Web. Begitu juga, jika anda mempunyai kaedah pengawal API Web yang menerima banyak objek kompleks, anda tidak akan dapat menggunakan kaedah ini secara langsung dari klien secara lurus ke hadapan.

[HttpPost]

public HttpResponseMessage PostAuthor (Pengarang pengarang, string otentikasiToken)

{

  // Kod biasa

  kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

}

Anda boleh meneruskan parameter ke kaedah pengawal API Web menggunakan atribut [FromBody] atau [FromUri]. Perhatikan bahawa atribut [FromBody] hanya dapat digunakan sekali dalam senarai parameter kaedah. Untuk mengulangi, anda hanya dibenarkan menyampaikan satu nilai (jenis sederhana atau kompleks) sebagai parameter ke kaedah pengawal API Web ketika menggunakan atribut [FromBody]. Anda boleh melewati sebilangan parameter menggunakan atribut [FromUri] tetapi itu bukan penyelesaian yang ideal dalam kes kami.

Dan sekarang, penyelesaiannya

Sekarang kita telah memahami apa masalahnya ketika menyampaikan parameter ke kaedah pengawal API Web, mari kita meneroka kemungkinan penyelesaiannya. Salah satu cara untuk mencapai ini adalah dengan meneruskan objek kompleks sebagai atribut [FromBody] dan parameter rentetan melalui Uri seperti yang ditunjukkan dalam potongan kode di bawah.

$ .ajax ({

 url: 'api / author? authenticationToken = abcxyz',

 taip: 'POST',

  data: JSON.stringify (pengarang),

 dataType: 'json',

 kejayaan: fungsi (data) {

   amaran (data);

}});

Anda perlu mengubah kaedah pengawal API Web anda untuk menguraikan rentetan pertanyaan seperti yang ditunjukkan di bawah.

[HttpPost]

public HttpResponseMessage PostAuthor (Pengarang pengarang)

{

  var data = Request.RequestUri.ParseQueryString ();

  kriteria rentetan = queryItems ["authenticationToken"];

  // Kod biasa untuk menyimpan data dalam pangkalan data

  kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

}

Baiklah, tetapi bagaimana jika anda mempunyai beberapa objek kompleks untuk dilewatkan sebagai parameter kepada kaedah pengawal API Web? Anda boleh membuat satu objek yang membungkus pelbagai parameter. Rujuk kelas AuthorRequest yang diberikan di bawah.

kelas awam AuthorRequest

   {

      Pengarang Pengarang awam {get; menetapkan; }

      tali umum Token {get; menetapkan; }

   }

Pada dasarnya, anda boleh membungkus beberapa parameter dalam satu kelas dan menggunakan kelas ini sebagai parameter untuk kaedah pengawal API Web anda.

Berikut adalah kaedah pengawal API Web yang dikemas kini.

[HttpPost]

public HttpResponseMessage PostAuthor (permintaan Penulis Permintaan)

  {

       var author = request.Author;

       var token = request.Token;

       // Kod biasa untuk menyimpan data dalam pangkalan data

       kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

  }

Anda juga dapat menggunakan JObject untuk menguraikan beberapa nilai parameter dari luar objek.

[HttpPost]

awam HttpResponseMessage PostAuthor (JObject jsonData)

{

    dinamik json = jsonData;

    JObject jauthor = json.Author;

    string token = json.Token;

    var author = jauthor.ToObject ();

    // Kod biasa untuk menyimpan data dalam pangkalan data

    kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

}

Kaedah lain untuk menyelesaikannya adalah dengan menggunakan FormDataCollection. Secara kebetulan, FormDataCollection adalah koleksi pasangan kunci / nilai seperti FormCollection di MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (borangDataCollection form)

        {

            var author = form.Get ("Pengarang");

            var token = form.Get ("Token");

            // Kod biasa untuk menyimpan data dalam pangkalan data

            kembali Permintaan.CreateResponse (HttpStatusCode.OK, "Kejayaan ...");

        }

Terima kasih kepada kerangka kerja kerangka API API, anda juga dapat membuat pengikat parameter tersuai anda sendiri dengan memperluas kelas HttpParameterBinding untuk memberikan sokongan untuk mengikat beberapa parameter.

Cara melakukan lebih banyak perkara dalam ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Cara menangani ralat dalam API Web ASP.NET
  • Cara menyampaikan beberapa parameter ke kaedah pengawal API Web
  • Cara log metadata permintaan dan respons di API Web ASP.NET
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan suntikan kebergantungan dalam ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Cara bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService dalam ASP.NET Core
  • Cara menggunakan perkhidmatan WCF SOAP di ASP.NET Core
  • Cara meningkatkan prestasi aplikasi ASP.NET Core
  • Cara menggunakan API Web Teras ASP.NET menggunakan RestSharp
  • Cara bekerja dengan log masuk di ASP.NET Core
  • Cara menggunakan MediatR dalam ASP.NET Core
  • Cara bekerja dengan keadaan sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Fahami pengikatan parameter dalam ASP.NET Web API
  • Cara memuat naik fail dalam ASP.NET Core MVC
  • Cara melaksanakan pengendalian pengecualian global dalam ASP.NET Core Web API
  • Cara melaksanakan pemeriksaan kesihatan di ASP.NET Core
  • Amalan terbaik dalam membuat cache di ASP.NET
  • Cara menggunakan pesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS pada API Web anda
  • Bila hendak menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerjasama dengan Redis Cache di .NET
  • Bila hendak menggunakan Task.WaitAll vs. Task.WhenAll in .NET