HTTP Methods
HTTP Method adalah kumpulan request method untuk menjelaskan tujuan dari pengiriman request dan apa yang diharapkan setelah request berhasil. Yang paling umum biasanya GET dan POST. Padahal selain itu ada beberapa method lainnya yang mungkin masih jarang terdengar. HTTP Method memiliki karakteristiknya masing-masing yang digunakan untuk berbagai kasus tertentu. Setidaknya ada 4 karakteristik, yaitu Safe, Idempotent, Non-Idempotent, dan Cachable:
- Safe, artinya method tersebut tidak mengubah data;
- Idempotent, artinya jika method tersebut dipanggil dengan request yang sama berkali-kali hasilnya tetap sama;
- Non-Idempotent, artinya jika method tersebut dipanggil dengan request yang sama berkali-kali maka akan ada efek samping di server tiap dipanggil;
- Cachable, artinya method tersebut hasilnya bisa di-cache;
GET
Ini adalah default HTTP Method. Tujuannya adalah untuk mengambil data. Method ini Safe, Cachable, dan Idempotent. Misalkan kita ingin mengambil data user dengan id=123 maka itu ga akan mengubah data apa pun. Meskipun beberapa kali dipanggil dengan request yang sama maka hasilnya tetap sama. Selain itu kita bisa atur agar responsenya bisa di-cache di web dan ketika user berkali-kali memanggil endpoint ini maka bisa diambil datanya lewat cache di web secara otomatis tanpa perlu diproses ulang di server.
GET /users/123 HTTP/1.1HTTP/1.1 200 OK
Content-Type: application/json
{ "id": 123, "name": "Ali" }POST
Ini juga salah satu method yang cukup dikenal. Tujuannya adalah untuk menambah data atau trigger event tertentu di server. Method ini Non-Idempotent. Misalkan kita memanggil endpoint user untuk create user 10x dengan request yang sama maka hasilnya akan membuat user baru sebanyak 10x.
POST /users HTTP/1.1
Content-Type: application/json
{ "name": "Ali" }HTTP/1.1 201 CreatedPUT
Sama seperti method put() di Java, tujuannya adalah untuk menambah atau mengganti data. Jika data ada maka akan diganti, jika ga ada maka akan ditambah. Method ini karakteristiknya Idempotent karena jika dipanggil berkali-kali maka hasilnya tetap sama, ga akan mengganti atau menambah data baru sebanyak yang dipanggil. Misalnya kita memanggil endpoint user dengan method PUT dengan request yang sama sebanyak 10x maka data yang diganti atau ditambah tetap hanya 1 seperti saat pertama kali dipanggil.
PUT /users/123 HTTP/1.1
Content-Type: application/json
{ "id": 123, "name": "Oki" }HTTP/1.1 200 OKPATCH
Mirip dengan PUT, fungsinya juga untuk mengubah data, tapi yang diubah hanya sebagian, bukan diganti keseluruhan. Bedanya lagi, method ini Non-Idempotent. Misalnya user punya uang di rekening Rp1.000.000. Lalu kita panggil endpoint withdrawal dengan request amount=100000 menggunakan method PATCH, maka jumlah uang user akan berkurang Rp100.000 tiap dipanggil. Kalau dipanggil 5x berarti uang user akan berkurang sebanyak Rp500.000.
PATCH /users/123/withdrawal HTTP/1.1
Content-Type: application/json
{ "id": 123, "amount": 100000 }HTTP/1.1 200 OK
Content-Type: application/json
{ "id": 123, "balance": 900000 }DELETE
Sesuai namanya, ini tujuannya untuk menghapus data. Method ini Idempotent. Misalkan kita memanggil endpoint user dengan id=123 menggunakan method DELETE sebanyak 10x maka data yang terhapus tetap 1.
DELETE /users/123 HTTP/1.1HTTP/1.1 204 No ContentHEAD
Ini mirip dengan GET, sama-sama Safe, Idempotent, dan Cacheable. Yang jadi pembeda adalah method HEAD ga ada response body, hanya ada response header. Tujuannya adalah untuk ngecek response header doang sehingga lebih ringan dari GET. Misalnya untuk ngecek metadata, ngecek ukuran file sebelum download, ngecek cache, dan info lainnya yang ada di response header.
HEAD /vid/mahasiswi+nakal.3gp HTTP/1.1HTTP/1.1 200 OK
Content-Type: video/3gp
Content-Length: 52342
Last-Modified: Tue, 01 Oct 2005 10:00:00 GMTOPTIONS
OPTIONS berfungsi untuk ngecek ke server apa aja pilihan HTTP Method yang bisa dilayani oleh endpoint tersebut. Method ini Safe dan Idempotent. Ini juga ga ada response body dan cuma ada response header, tapi spesifik response header yang berisi info HTTP Method yang bisa dilayani doang.
OPTIONS /users HTTP/1.1HTTP/1.1 204 No Content
Allow: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: *TRACE
Sebenarnya ini jarang digunakan dan seringnya diblok karena alasan keamanan. Gw pun belum pernah menggunakannya. Tujuannya adalah untuk debugging mengecek pantulan pesan apakah ada server perantara seperti CDN, Proxy, atau Firewall yang mengubah header sepanjang jalan menuju server tujuan. Setiap header yang dikirim ekspektasinya adalah akan mengembalikan header yang sama. Jika berbeda berarti ada perantara yang mengubahnya di tengah jalan. Method ini karakteristiknya juga Safe dan Idempotent.
TRACE /index.html HTTP/1.1
Host: www.sample.com
User-Agent: Mozilla/5.0
Accept-Language: en-USHTTP/1.1 200 OK
Host: www.sample.com
User-Agent: Mozilla/5.0
Accept-Language: en-USConnect
Fungsinya adalah untuk membangun jalur koneksi ke HTTPS lewat HTTP Proxy. Misalkan kita ingin mengakses website yang memiliki HTTP Proxy, maka kita akan memanggil website tersebut dengan method CONNECT. Setelah Proxy mengijinkan untuk masuk ke server tujuan maka jalur koneksi akan terbentuk dan kita bisa berkomunikasi dengan server tujuan. Method ini Non-Idempotent karena tiap kita mengirim method CONNECT maka Proxy akan trigger event untuk membangun jalur koneksi baru.
CONNECT www.sample.com:443 HTTP/1.1HTTP/1.1 200 Connection EstablishedBest Practice
Meskipun tiap method punya karakteristik dan fungsinya masing-masing, tapi tetap aja kendali penuh ada di server. Ga ada jaminannya method GET itu Idempotent, bisa saja si pembuat API bikin method GET untuk bikin data baru. Tapi sebaiknya memang HTTP Method itu harus sesuai dengan tujuan dan karakteristiknya untuk mempermudah komunikasi meskipun ini hanya convention saja. Pasti bakal repot ke depannya kalau bikin API seenak jidat.
Ada beberapa kasus di mana ini diperbolehkan. Misalnya kita ada endpoint untuk pencarian dengan pilihan filter yang banyak. Secara karakteristik, endpoint pencarian itu harusnya pakai GET. Masalahnya, GET itu diperuntukkan tanpa Request Body sehingga variabel pencarian harus ditulis di dalam query parameter. Jika query parameternya banyak maka URL akan kepanjangan sehingga bisa error karena URL itu ada batasnya. Untuk hal ini memang diperbolehkan pakai POST untuk mengakalinya meskipun harusnya pencarian itu Idempotent. Kabar baiknya, saat ini lagi diwacanakan HTTP Method yang baru, yaitu QUERY. HTTP Method ini rencananya memang untuk kasus kayak pencarian di mana kita butuh method yang bisa menerima Request Body tapi tetap Safe dan Idempotent. Hingga tulisan ini gw rilis statusnya masih wacana sih, belum ada kabar terbarunya lagi. Gw sih setuju banget dengan wacana ini.
