Fahami pengikatan parameter dalam ASP.Net Web API

ASP.Net Web API adalah rangka kerja ringan yang dapat digunakan untuk membangun perkhidmatan HTTP RESTful. Semasa bekerja dengan kaedah pengawal di API Web, anda sering perlu meneruskan parameter ke kaedah tersebut. "Parameter" di sini hanya merujuk pada argumen untuk metode, sementara "pengikatan parameter" merujuk pada proses menetapkan nilai ke parameter metode API Web.

Perhatikan bahawa terdapat dua cara API Web dapat mengikat parameter: model binding dan formatters. Model binding digunakan untuk membaca dari rentetan pertanyaan, sementara formatters digunakan untuk membaca dari badan permintaan. Anda juga boleh menggunakan penukar jenis untuk membolehkan API Web memperlakukan kelas sebagai jenis sederhana dan kemudian mengikat parameter dari URI. Untuk melakukan ini, anda perlu membuat TypeConverter tersuai. Anda juga boleh membuat pengikat model khusus dengan menerapkan antara muka IModelBinder di kelas anda dan kemudian menerapkan kaedah BindModel. Untuk lebih lanjut mengenai penukar jenis dan pengikat model, lihat dokumentasi Microsoft ini.

Sekarang, untuk mengikat parameter, API Web mengikuti peraturan ini: Untuk jenis mudah, API Web cuba mendapatkan nilai dari URI, dan untuk jenis kompleks, API Web cuba mendapatkan nilai dari badan permintaan. Jenis mudah di sini merujuk kepada jenis primitif .Net - int, bool, double, float, dan sebagainya - dan jenis lain yang merangkumi TimeSpan, DateTime, Guid, perpuluhan, dan rentetan. Ini juga termasuk jenis apa pun yang jenis penukar tersedia yang dapat menukar dari rentetan. Di bahagian seterusnya kita akan meneroka atribut [FromBody] dan [FromUri] yang digunakan untuk mengikat nilai dari badan permintaan dan URI masing-masing.

Bila hendak menggunakan [FromBody] dan [FromUri] di Web API

Sekiranya anda telah menggunakan API Web untuk beberapa waktu, anda mungkin biasa dengan atribut [FromBody] dan [FromUri]. Atribut [FromUri] diawali dengan parameter untuk menentukan bahawa nilainya harus dibaca dari URI permintaan, dan atribut [FromBody] digunakan untuk menentukan bahawa nilai harus dibaca dari badan permintaan.

Untuk semua jenis primitif (int, double, float, etc.), runtime API Web cuba membaca nilai dari URI permintaan HTTP. Untuk jenis kompleks (contoh kelas), runtime API Web cuba membaca nilai dari isi permintaan HTTP menggunakan pemformat jenis media. Ini adalah tingkah laku lalai API Web. 

Oleh itu, jika anda mempunyai nilai dalam URI permintaan yang merupakan jenis primitif, anda tidak perlu menentukan atribut [FromUri]. Begitu juga, jika anda mempunyai nilai dalam badan permintaan yang jenisnya kompleks, anda tidak perlu menentukan atribut [FromBody]. Walau bagaimanapun, jika jenis primitif berada di badan permintaan atau jenis kompleks berada di URI permintaan, anda mesti menentukan atribut [FromBody] atau [FromUri]. Sebabnya adalah bahawa anda tersasar dari tingkah laku lalai dalam kedua-dua kes tersebut.

Cara menggunakan [FromBody] dan [FromUri] di Web API

Coretan kod berikut menggambarkan bagaimana anda dapat menentukan atribut [FromBody] untuk jenis data asas yang dilewatkan sebagai parameter ke kaedah API Web.

kelas awam SecurityController: ApiController

{

    kiriman HttpResponseMessage awam ([FromBody] int id awam)

    {

       // Tuliskan kod anda di sini

    }

}

Dan berikut adalah coretan kod yang menggambarkan bagaimana anda dapat meneruskan jenis kompleks sebagai parameter ke kaedah API Web menggunakan atribut FromUri.

kelas awam SecurityController: ApiController

{

    awam HttpResponseMessage Post ([FromUri] Pengguna pengguna)

    {

       // Tuliskan kod anda di sini

    }

}

Perlu diingatkan bahawa menghantar data pengesahan pengguna seperti nama pengguna dan kata laluan melalui URI bukanlah amalan yang baik, walaupun anda mungkin menggunakan SSL. Ini kerana data tersebut mungkin disimpan ke log penyemak imbas, yang rentan terhadap paparan. Semasa menyampaikan data sensitif (nama pengguna, kata laluan, maklumat kad kredit, dll.) Melalui badan permintaan, sangat mustahak untuk menggunakan [FromBody] dalam setiap keadaan.

Perhatikan bahawa ketika anda menggunakan atribut [FromBody] saat meneruskan parameter ke metode Web API, runtime API Web memanfaatkan tajuk jenis konten untuk memilih formatter yang betul. Anda boleh mengetahui lebih lanjut mengenai perundingan kandungan di Web API dari artikel saya di sini.