Lo developer backend. Dapet request: bikin search API dengan 15 parameter filter, sorting, pagination, aggregation - plus user bisa milih field mana aja yang mau dikembaliin.
Nulis GET endpoint? Query string-nya jadi super panjang, url-encoded complex values, error-prone, dan browser/load balancer punya batas panjang URL (biasanya 8KB).
Nulis POST? Teknisnya sih work - tapi POST gak idempotent. Search yang sama diulang 2x seharusnya balikin hasil yang sama. POST ngelanggar semantik HTTP.
Lo stuck di antara dua pilihan yang sama-sama gak ideal. Nah, HTTP sebenernya punya lebih banyak method dari yang lo pake sehari-hari. Dan beberapa di antaranya - termasuk yang cukup baru - bisa jadi solusi buat kasus kayak gini.
QUERY - GET Dengan Body, Resmi Standar
Ini yang paling menarik. RFC 9651 resmi dipublikasi September 2024 sebagai Proposed Standard. Ada dua penulis: Roy Fielding (ya, bapak REST sendiri) dan Julian Reschke.
Cara Kerja
QUERY itu safe dan idempotent - sama kayak GET. Artinya:
- Gak ngubah state server
- Request yang sama dikirim berkali-kali -> hasilnya sama
- Bisa di-cache proxy/CDN
Yang bikin QUERY beda dari GET: boleh punya request body. Jadi complex query bisa lo masukin sebagai JSON di body, bukan di query string yang rentan truncated.
QUERY /api/products HTTP/1.1
Content-Type: application/json
Accept: application/json
{
"filters": {
"category": "electronics",
"price_min": 100000,
"price_max": 5000000,
"in_stock": true
},
"sort": { "field": "price", "order": "asc" },
"fields": ["name", "price", "stock"],
"page": 1,
"per_page": 20
}
Penggunaan Sehari-hari
Di bayangan gue, ini ideal buat:
- Data grid/table - frontend yang render tabel interaktif (filter + sort + pagination + column selection). Body JSON lebih abundant dan gampang di-parsing daripada query string.
- GraphQL-like queries - client minta field spesifik dari response. Body QUERY bisa jadi semacam DSL ringan tanpa perlu infra GraphQL.
- Bulk status check - cek status ratusan ID sekaligus. Lo kirim array ID di body, dapet array status balik.
- Machine-to-machine API - antar service internal yang hubungannya read-only tapi butuh criteria kompleks.
Cache-nya juga jalan: proxy bisa cache QUERY response berdasarkan Content-Location header yang server tentuin. Jadi kalo dua client kirim QUERY yang identik, mereka bisa dapet response dari cache.
Fun Fact
RFC 9651 literally bilang ini method baru pertama yang dibikin Roy Fielding sejak HTTP/1.1. Setelah 25 tahun REST, baru sekarang dia nambah method baru. Alasan dia nulis RFC ini? Karena semenjak 2015-an makin banyak API yang pake POST buat search - dan itu secara semantik salah. Fielding nulis ini buat kasih opsi yang proper tanpa nyuruh orang pake GET yang query string-nya gila-gilaan.
PURGE - Method Favorit CDN
PURGE bukan method resmi HTTP. Gak ada RFC-nya. Tapi ini mungkin method yang paling banyak dipake di luar method standar.
Cara Kerja
PURGE adalah method de facto buat cache invalidation di CDN. Konsepnya simpel:
- Lo ngirim request
PURGE /products/handphone-123ke CDN - CDN hapus resource itu dari cache edge server
- Request berikutnya yang masuk - CDN fetch fresh dari origin
PURGE /products/handphone-123 HTTP/1.1
Host: api.toko-lo.com
Itu aja. Gak perlu purge seluruh cache. Gak perlu nunggu TTL kedaluwarsa. Cuma satu URL, langsung bersih.
Penggunaan Sehari-hari
- E-commerce - lo update harga produk. Tinggal PURGE URL produk itu di CDN, user langsung lihat harga baru tanpa nunggu cache expire.
- Content publishing - abis publish artikel atau update halaman berita, PURGE URL-nya di edge. Content baru nyebar dalam hitungan detik.
- API response update - kalo ada data master (daftar toko, daftar kategori) yang jarang berubah tapi harus real-time pas diupdate.
Siapa yang Support?
| Platform | Dukungan |
|---|---|
| Varnish | PURGE native - define di VCL: acl purge { "localhost"; } |
| Cloudflare | Pake header: curl -X PURGE https://zone.com/url - support single URL & multi-URL purge |
| Fastly | PURGE + soft PURGE (invalidate tapi tetap serve stale kalo origin down) |
| Akamai | Pake header PURGE atau CP Code purge via API |
| Nginx (+ ngx_cache_purge) | Module tambahan, enable PURGE buat FastCGI/proxy cache |
| CDN umum | Mayoritas implementasi support PURGE sebagai non-standard method |
Kelemahan
Gak ada standardisasi - tiap CDN implementasi beda cara validate PURGE:
- Varnish pake ACL (IP-based)
- Cloudflare pake API Token di header
- Fastly pake API key di header
Lo harus sesuaikan client code dengan platform. Tapi semantiknya sama: hapus cache untuk resource tertentu.
Fun Fact
PURGE sebenernya mirip cara kerja HTTP cache headers - tapi beda mekanisme. Kalo lo set Cache-Control: no-cache, itu ngasih tau client/CDN buat revalidate Sebelum pake cache. PURGE itu paksa hapus langsung. Analoginya: no-cache itu “cek dulu ya kalo mau pake”, PURGE itu “buang aja yang lama”.
SEARCH - Kakak Tua QUERY
SEARCH didefinisikan di RFC 5323 tahun 2008 sebagai extension WebDAV. Idenya sama kayak QUERY: method yang safe dan idempotent dengan body. Tapi bedanya - SEARCH pake XML. Makanya kurang populer.
Cara Kerja
SEARCH /api/products HTTP/1.1
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="UTF-8"?>
<D:searchrequest xmlns:D="DAV:">
<D:basicsearch>
<D:select>
<D:prop>
<D:displayname/>
<D:getcontentlength/>
<D:getcontenttype/>
</D:prop>
</D:select>
<D:from>
<D:scope>
<D:href>/api/products/</D:href>
<D:depth>0</D:depth>
</D:scope>
</D:from>
<D:where>
<D:and>
<D:eq>
<D:prop><D:getcontenttype/></D:prop>
<D:literal>image/jpeg</D:literal>
</D:eq>
<D:gt>
<D:prop><D:getcontentlength/></D:prop>
<D:literal>500000</D:literal>
</D:gt>
</D:and>
</D:where>
</D:basicsearch>
</D:searchrequest>
Iya, itu buat cari file JPEG yang lebih besar dari 500KB. Di XML. Dengan namespace DAV:.
Penggunaan Sehari-hari
Jujur aja - udah jarang. WebDAV secara umum udah gak populer di web development modern. Tapi SEARCH masih dipake di:
- Enterprise document management - SharePoint, Alfresco, documentum masih pake WebDAV
- File server WebDAV - tools kayak Cyberduck, ownCloud punya implementasi WebDAV
- CALDAV / CARDDAV - report method di ekosistem calendar & contact (iCal, Google Calendar sync)
SEARCH vs QUERY - Bedanya?
| Aspek | SEARCH (RFC 5323) | QUERY (RFC 9651) |
|---|---|---|
| Standar | 2008 (WebDAV) | 2024 (HTTP core) |
| Body format | XML (wajib) | Bebas (JSON, XML, CBOR, dll) |
| Safe | Ya | Ya |
| Idempotent | Ya | Ya |
| Cache-able | Ya (dengan syarat) | Ya (via Content-Location) |
| Penggunaan | Dokumen enterprise, file server | General API, search, query |
| Adopsi | Niche | Baru, prospek bagus |
Fun Fact
Banyak yang kira SEARCH udah mati - tapi RFC 9651 justru menyebut SEARCH sebagai “pendahulu QUERY.” Mereka sadar kalo konsep “HTTP method dengan body yang safe dan idempotent” itu berguna dan udah ada yang coba (SEARCH). Yang salah dari SEARCH bukan idenya - tapi keputusan buat paksa pake XML format di era JSON.
Mana yang Pantes Lo Pake?
Pertanyaan real-nya: ini practical gak buat lo? Atau cuma jadi pengetahuan tambahan?
| Method | Kapan Pake |
|---|---|
| QUERY | API yang butuh complex query dengan body (search, filter, bulk read). Relatif baru (2024) - butuh setup khusus di server/framework. |
| PURGE | Kalo lo pake CDN dan butuh cache invalidation real-time. Ini paling siap-pakai - support hampir semua CDN besar. |
| SEARCH | Hanya kalo lo kerja dengan ekosistem WebDAV (SharePoint, Alfresco). Buat project baru? Pake QUERY aja. |
Mau mulai dari mana? PURGE - paling gampang, lo tinggal curl -X PURGE ke URL yang udah di-cache CDN. Praktis langsung kerasa efeknya kalo lo sering ngupdate content dan pusing sama cache expired.
Kalo lo punya API search yang kompleks, coba cek apakah framework lo support QUERY method di route. Kalo belum - taruh di backlog aja. Ini investasi jangka panjang, karena standarnya baru - dan butuh waktu sampe semua framework & proxy support.
Terima kasih sudah meluangkan waktu buat baca artikel ini, semoga ada manfaat yang bisa diambil. 🐾
