Penggunaan Http Method GET dan POST pada REST API
Sebuah contoh kasus sikap coder yang epic fail sampah banget
Okay! pada posting kali ini saya bakal cerita tentang contoh kasus salah kaprah penggunaan http method seperti GET dan POST dalam REST API.
Secara best practice atau by definition HTTP Methods pada REST API.
- GET digunakan untuk request data, State server tidak berubah walaupun di-GET terus-terusan kecuali data di server dirubah oleh client yang lain.
- POST digunakan request update/create data. State server berubah hati-hati menggunakan method ini.
Karakteristik dari method GET adalah sebagai berikut :
- Tidak berbahaya.
- Dapat di-bookmarked seperti halaman website di-bookmarked di browser.
- Di-chached.
- application/x-www-form-urlencoded.
- Parameters request tersimpan di-history browser.
- Hanya karakter ASCII.
- Kurang secure.
- Data terlihat di url, misal https://codot.com/product?id=100.
Berbeda dengan GET berikut adalah karakteristik dari method POST :
- Tidak bisa di-bookmarked.
- Tidak di-chached.
- Application/x-www-form-urlencoded or multipart/form-data.
- Parameter request tidak disimpan di history browser.
- Data yang di request boleh apa saja.
- Lebih aman dari GET.
- Data tidak terlihat di url seperti GET.
Dari penjelasan karakteristik method GET dan POST diatas, jelas penggunaan nya. GET dari awal di-design untuk request data, baik secara performance atau security. Jangan bandel request data dengan menggunakan method POST. Method POST dari sono nya di-design untuk request yang bersifat create/update data di server, baik secara performance atau security sudah dioptimasi. Jangan bandel diganti GET.
Beberapa kasus penggunaan GET dan POST.
Login
Login adalah sebuah aktifitas yang merubah state server seperti user session. Login adalah sebuah aktifitas yang rahasia. WTF! banget kalo dimplementasikan dengan method GET misal :
https://codot.com/login?id=bla&password=wkwkw
epic fail. Pake https gituh loh.
Contoh kasus lain misal kita mau membuat sebuah api tujuan nya untuk request data buku. Awalnya gini :
https://tokobukumantul.com/buku?id=1000
Api nya kira-kira seperti ini :
[HttpGet(“{id}”)]public async Task<ActionResult<BukuModel>> Buku(long id)
{
var bukuItem = await _context.BukuItems.FindAsync(id); if (bukuItem == null)
{
return NotFound();
} return bukuItem;}
Kemudian ada kebutuhan search. Dibuat lah api seperti ini :
https://tokobukumantul.com/buku?id=1000&judul=pengen%% kawin&pengarang=udin%%peot
API nya kira-kira seperti ini :
[HttpGet(“{id}/{judul}/{pengarang}”)]public async Task<ActionResult<BukuModel>> Buku(long id, string judul,string pengarang)
{
var bukuItem = await _context.BukuItems.FindAsync(item=>item.id==id && item.Judul.contains(judul) &&
item.Pengarang==pengarang); if (bukuItem == null)
{
return NotFound();
} return bukuItem;}
Kemudian kebutuhan terus berkembang parameter search tidak cukup dengan hanya id, judul, dan pengarang, tetapi perlu parameter penerbit, harga, diskon, review, dan lain-lain. Parameter akan sangat panjang sekali.
[HttpGet(“{id}/.....”)]public async Task<ActionResult<BukuModel>> Buku(long id, string judul,string pengarang, string penerbit, money harga, int diskon, review...........)
{}
Parameter sudah mulai tidak terkontrol sodara-sodara! datang lah ksatria clean coder : Tidak boleh suatu method mempunyai banyak parameter sukar dibaca!
Okay! Okay! kita buat parameternya menjadi object seperti ini :
[HttpGet(“action”)]public async Task<ActionResult<BukuModel>> Buku(BukuModel model)
{
var bukuItem = await _context.BukuItems.FindAsync(item==model); if (bukuItem == null)
{
return NotFound();
} return bukuItem;}
wah lumayan kodenya mudah dipahami clean code!!!.
Here we go! Api terakhir yang kita buat parameternya kan bukan tipe data primitive godaan pengen cepet selesai mulai sakau .Gimana bikin query string nya? Kayanya request pake json di body request POST enak tuh.
dirubahlah seperti ini :
[HttpPost(“action”)]public async Task<ActionResult<BukuModel>> Buku(BukuModel model)
{
var bukuItem = await _context.BukuItems.FindAsync(item==model);if (bukuItem == null)
{
return NotFound();
}return bukuItem;}
dengan request di body json seperti dibawah. Misal pengarang tipe datanya array string.
{
“pengarang”: [
“cecep”,
“asep”,
“ujang”
],
“isdiskon”: true,
“judul”: “perawan disarang jomblo”,
“harga”: 10000
……
}
banyak coder yang tidak tau caranya gimana membuat query string untuk API dengan parameter object. Banyak coder tau caranya POST dengan parameter object menggunakan json.
Coder mengubah jenis http method GET dengan PUT dengan alasan salah. karena tergoda untuk membuat kode supaya cepat selesai, emang mau kemana sih?. Boleh mengganti http method GET dengan PUT dengan alasan yang kuat.
Kejadian serupa banyak saya temui dalam kehidupan sehari-hari sebagai coder termasuk diri saya sendiri.
Okay! segitu dulu salam Nerakahhhhhh Ngodingggggggg!!!!