Pahami pengikatan parameter di ASP.Net Web API

ASP.Net Web API adalah kerangka kerja ringan yang dapat digunakan untuk membangun layanan HTTP RESTful. Saat bekerja dengan metode pengontrol di Web API, Anda akan sering kali perlu meneruskan parameter ke metode tersebut. "Parameter" di sini hanya merujuk pada argumen ke metode, sedangkan "pengikatan parameter" mengacu pada proses pengaturan nilai ke parameter metode API Web.

Perhatikan bahwa ada dua cara di mana API Web dapat mengikat parameter: pengikatan model dan pemformatan. Pengikatan model digunakan untuk membaca dari string kueri, sementara pemformat digunakan untuk membaca dari isi permintaan. Anda juga dapat menggunakan pengonversi tipe untuk mengaktifkan API Web untuk memperlakukan kelas sebagai tipe sederhana dan kemudian mengikat parameter dari URI. Untuk melakukan ini, Anda perlu membuat TypeConverter kustom. Anda juga dapat membuat binder model kustom dengan mengimplementasikan antarmuka IModelBinder di kelas Anda lalu mengimplementasikan metode BindModel. Untuk informasi lebih lanjut tentang pengonversi tipe dan pengikat model, lihat dokumentasi Microsoft ini.

Sekarang, untuk mengikat parameter, API Web mengikuti aturan ini: Untuk tipe sederhana, API Web mencoba mendapatkan nilai dari URI, dan untuk tipe kompleks, API Web mencoba mendapatkan nilai dari badan permintaan. Tipe sederhana di sini merujuk pada tipe primitif .Net — int, bool, double, float, dan seterusnya — dan tipe lain yang menyertakan TimeSpan, DateTime, Guid, desimal, dan string. Ini juga mencakup tipe apa pun yang menyediakan konverter tipe yang dapat mengonversi dari string. Di bagian selanjutnya kita akan mempelajari atribut [FromBody] dan [FromUri] yang digunakan untuk mengikat nilai dari badan permintaan dan URI masing-masing.

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

Jika Anda telah menggunakan API Web untuk beberapa waktu, Anda mungkin sudah familiar dengan atribut [FromBody] dan [FromUri]. Atribut [FromUri] diawali dengan parameter untuk menentukan bahwa nilai harus dibaca dari URI permintaan, dan atribut [FromBody] digunakan untuk menentukan bahwa nilai harus dibaca dari isi permintaan.

Untuk semua tipe primitif (int, double, float, dll.), Runtime API Web mencoba membaca nilai dari URI permintaan HTTP. Untuk tipe kompleks (instance kelas), runtime API Web mencoba membaca nilai dari isi permintaan HTTP menggunakan formatter tipe media. Ini adalah perilaku default Web API. 

Oleh karena itu, jika Anda memiliki nilai dalam URI permintaan yang berjenis primitif, Anda tidak perlu menentukan atribut [FromUri]. Demikian pula, jika Anda memiliki nilai dalam isi permintaan yang merupakan tipe kompleks, Anda tidak perlu menentukan atribut [FromBody]. Namun, jika tipe primitif berada dalam tubuh permintaan atau tipe kompleks berada dalam URI permintaan, Anda harus menentukan atribut [FromBody] atau [FromUri]. Alasannya adalah Anda menyimpang dari perilaku default dalam kedua kasus.

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

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat menentukan atribut [FromBody] untuk tipe data fundamental yang diteruskan sebagai parameter ke metode API Web.

kelas publik SecurityController: ApiController

{

    publik HttpResponseMessage Post ([FromBody] int id)

    {

       // Tulis kode Anda di sini

    }

}

Dan berikut ini potongan kode yang menggambarkan bagaimana Anda bisa meneruskan tipe kompleks sebagai parameter ke metode API Web menggunakan atribut FromUri.

kelas publik SecurityController: ApiController

{

    publik HttpResponseMessage Post ([FromUri] Pengguna pengguna)

    {

       // Tulis kode Anda di sini

    }

}

Perlu diperhatikan bahwa mengirim data autentikasi pengguna seperti nama pengguna dan sandi melalui URI bukanlah praktik yang baik, meskipun Anda mungkin menggunakan SSL. Ini karena data semacam itu mungkin disimpan ke log browser, yang rentan terhadap paparan. Saat mengirimkan data sensitif apa pun (nama pengguna, sandi, informasi kartu kredit, dll.) Melalui badan permintaan, sangat penting untuk menggunakan [FromBody] dalam setiap kasus.

Perhatikan bahwa saat Anda menggunakan atribut [FromBody] sambil meneruskan parameter ke metode API Web, runtime API Web memanfaatkan header jenis konten untuk memilih pemformat yang benar. Anda dapat mempelajari lebih lanjut tentang negosiasi konten di API Web dari artikel saya di sini.