
HTTP QUERY: Kaedah Request Baharu Antara GET dan POST
Selama ini, developer yang mempunyai query kompleks tetapi mahukan operasi read-only biasanya terpaksa memilih antara dua pilihan. Gunakan GET dan masukkan semua parameter ke dalam URL, atau gunakan POST walaupun request tersebut sebenarnya tidak mengubah apa-apa data.
Kedua-duanya ada masalah.
URL yang terlalu panjang boleh menyusahkan sesetengah perantara dan parameter di dalam URL juga mudah masuk ke dalam log — doa yang jarang dimakbulkan oleh disiplin logging aplikasi. POST pula tidak mempunyai semantik safe dan idempotent seperti GET, jadi infrastruktur HTTP tidak boleh menganggapnya sebagai operasi bacaan yang selamat untuk diulang atau di-cache.
Pada Jun 2026, IETF menerbitkan RFC 10008, yang memperkenalkan kaedah HTTP baharu bernama QUERY. Ia direka untuk menjadi safe dan idempotent seperti GET, tetapi juga boleh membawa body seperti POST.
Spesifikasi ini ialah hasil daripada kerja draft-ietf-httpbis-safe-method-w-body oleh Julian Reschke, James Snell (Cloudflare), dan Mike Bishop (Akamai). Kaedah tersebut kini turut disenaraikan dalam IANA HTTP Method Registry sebagai kaedah yang safe dan idempotent.
Artikel ini melihat kenapa QUERY diperlukan, bagaimana ia berfungsi pada peringkat HTTP, dan sejauh mana sokongannya pada pertengahan 2026.
Masalahnya: Dua kaedah, kedua-duanya ada kekangan
GET bersifat safe dan idempotent. Cache, proksi dan pelbagai komponen HTTP memang direka untuk mengendalikan GET.
Masalahnya ialah query perlu diletakkan di dalam URI.
Itu boleh menjadi masalah apabila query semakin kompleks:
- Had panjang URL bergantung pada perisian dan perantara yang digunakan. HTTP mengesyorkan sokongan sekurang-kurangnya 8000 oktet, tetapi pelaksanaan sebenar boleh berbeza.
- Setiap kombinasi parameter menghasilkan URI yang berbeza. Ini boleh menyebabkan jumlah variasi cache dan data analitik meningkat.
- Kandungan URI lebih mudah muncul dalam access log, sejarah pelayar dan sistem pemantauan. Jika query mengandungi maklumat sensitif, semuanya direkodkan secara lalai.
POST menyelesaikan masalah body kerana query boleh dihantar sebagai kandungan request.
Tetapi POST bukan kaedah safe dan bukan idempotent. Infrastruktur tidak boleh menganggap request tersebut sebagai operasi bacaan yang selamat untuk diulang. Cache juga tidak mengendalikan POST dengan cara yang sama seperti GET.
Sebab itulah banyak API akhirnya menggunakan corak POST untuk operasi carian.
QUERY cuba mengisi ruang antara kedua-duanya.
Apa sebenarnya QUERY?
Menurut spesifikasi, QUERY meminta server memproses kandungan request secara safe dan idempotent, kemudian mengembalikan hasil pemprosesan itu.
Kandungan request bersama Content-Type menentukan query yang dihantar. Server pula menentukan skop query berdasarkan request target.
Perbezaan penting berbanding GET ialah body QUERY boleh mengandungi query itu. Responsnya pula merupakan hasil pemprosesan query, bukannya semata-mata representasi resource yang ditunjukkan oleh URI.
Antara sifat utama QUERY ialah:
| Property | GET | QUERY | POST |
|---|---|---|---|
| Safe (read-only) | ya | ya | berkemungkinan tidak |
| Idempotent (boleh ulang) | ya | ya | berkemungkinan tidak |
| Membawa request body | tidak | ya | ya |
| Boleh di-cache | ya | ya | terhad |
| URI untuk query itu sendiri | ya | pilihan (Location) | tidak |
| URI untuk hasil query | pilihan (Content-Location) | pilihan (Content-Location) | pilihan |
Disebabkan QUERY bersifat safe dan idempotent, klien boleh mengulang request selepas kegagalan sambungan. Cache juga boleh menyimpan responsnya apabila syarat cache dipenuhi.
Ini memberikan QUERY semantik yang lebih sesuai untuk operasi carian berbanding menggunakan POST semata-mata kerana query itu mempunyai body.
Server mesti menolak request QUERY jika Content-Type tiada atau tidak konsisten dengan kandungan body.
Query yang berjaya tetapi tidak menghasilkan kandungan boleh menggunakan 204 No Content. Jika hasil tersedia dalam respons, 200 OK boleh digunakan.
Rupa QUERY pada peringkat rangkaian
Contoh daripada RFC boleh dilihat seperti ini:
QUERY /feed HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
q=foo&limit=10&sort=-published
Perbezaannya mudah dilihat.
Dengan GET, query biasanya berada dalam URI:
GET /feed?q=foo&limit=10&sort=-published HTTP/1.1
Dengan QUERY, /feed kekal sebagai request target, manakala query sebenar berada di dalam body.
Spesifikasi tidak menghadkan penggunaan kepada satu format sahaja. Query boleh menggunakan mana-mana media type yang mempunyai semantik query, termasuk application/json, GraphQL, SQL, JSONPath atau bahasa query RDF.
Content-Type memberitahu server format yang digunakan dan server menentukan sama ada ia menyokong format itu.
Laluan keluar: Location dan Content-Location
RFC 10008 turut menyediakan Location dan Content-Location untuk menghubungkan hasil QUERY dengan resource HTTP yang boleh diakses semula.
Locationboleh mengenal pasti equivalent resource untuk query itu. URI itu kemudiannya boleh digunakan denganGETuntuk mengakses query yang sama tanpa perlu menghantar body sekali lagi.Content-Locationboleh mengenal pasti URI bagi hasil query tertentu. Ini membolehkan hasil itu diambil semula atau dikongsi melalui URI.
Bahagian ini penting untuk aplikasi yang mempunyai query berat atau mengambil masa untuk diproses.
Sebagai contoh, server boleh menerima QUERY, menjalankan pemprosesan yang mahal, kemudian menyediakan URI yang boleh digunakan untuk mengambil hasil itu melalui GET.
Corak seperti ini boleh berguna untuk polling, pagination dan penggunaan cache.
Accept-Query: Mengiklankan bahasa yang anda fahami
Spesifikasi ini juga mendaftarkan header Accept-Query.
Server boleh menggunakannya untuk memberitahu klien bahawa resource itu menyokong QUERY serta format query yang diterimanya:
HTTP/1.1 200 OK
Accept-Query: application/sql, application/jsonpath
Nilai itu ialah Structured Fields List. Header ini juga boleh diberikan pada respons GET, membolehkan klien mengetahui sokongan server sebelum menghantar request QUERY.
Tools seperti h3 turut menyediakan helper seperti appendAcceptQuery dan requireContentType untuk membantu proses itu.
Nota keselamatan yang perlu diingat
- Privasi tidak semestinya bermaksud query menjadi rahsia. Kandungan URI lebih lazim direkodkan oleh log dan perantara berbanding body request. Menggunakan body untuk query boleh mengurangkan pendedahan itu. Namun, server masih perlu berhati-hati apabila menghasilkan URI melalui
LocationatauContent-Location. URI itu tidak sepatutnya mengandungi data sensitif daripada query asal. - Cache perlu mengira key dengan betul. Jika cache menggunakan request body sebagai sebahagian daripada cache key, ia perlu menggunakan kandungan yang sama seperti yang digunakan oleh server. Jika tidak, respons untuk satu query berpotensi diberikan kepada query yang lain.
- Preflight CORS diperlukan.
QUERYbukan kaedah yang termasuk dalam CORS safelisted methods. RequestQUERYlintas sumber daripada pelayar akan menyebabkan preflightOPTIONS. Server perlu memasukkanQUERYdalamAccess-Control-Allow-Methods. - Body masih mempunyai risiko saiz. Oleh kerana body
QUERYboleh mengandungi input yang besar dan dikawal pengguna, server perlu menetapkan had saiz serta melakukan validasi seperti yang dilakukan untuk requestPOST.
Sokongan sebenar pada hari ini (Ogos 2026)
Sokongan untuk QUERY memang sudah wujud, tetapi belum seragam — semak setiap satunya berdasarkan versi anda. Bahagian server jauh lebih bersedia berbanding pelayar.
Di bahagian server (Server-side), boleh digunakan sekarang:
- Node.js — sokongan
QUERYbergantung pada versillhttpyang dibundel (sokongan parser disalurkan ke Node melalui nodejs/node#51719) — semakhttp.METHODSpada versi Node anda dan bukannya menganggap versi minimum tertentu. Klien fetchundicimenambah sokonganQUERYdalam versi 8.6.0. - Go —
net/httpboleh mengendalikanQUERYseperti kaedah tersuai lain melaluihttp.NewRequest. Tiada perubahan khas diperlukan pada standard library. - h3 (unjs) — Menyediakan sokongan
app.query()serta helper untukAccept-QuerydanContent-Type. - ASP.NET Core — Route boleh menggunakan
MapMethods("/search", ["QUERY"], handler). .NET 10 juga mula menyediakanHttpMethod.Querydi bahagian klien. - Express 5 — sokongan
QUERYdijejaki dalam expressjs/express#5615; sahkan versi anda mengendalikan kata kerja itu (express.json()masih diperlukan jika body JSON hendak dibaca melaluireq.body). - Fastify, server Java (Jetty, Tomcat), Django, Spring, Laravel — sokongan berbeza mengikut versi; sahkan versi anda sebelum bergantung pada
QUERY.
Di bahagian klien (Client-side):
fetch(url, { method: "QUERY", body })boleh digunakan kerana Fetch tidak menyekat kaedah itu. Ia hanya melarangCONNECT,TRACEdanTRACK. Pastikan kaedah ditulis sebagaiQUERYdalam huruf besar.- Pelayar belum menyokong
QUERYsecara native. HTML<form>juga belum mempunyai mekanisme deklaratif untuk menghantar body menggunakanQUERYdan akan menggunakan kaedah yang disokongnya sepertiGETatauPOST. - Pelayar belum meng-cache respons
QUERYsecara native walaupun spesifikasi HTTP membenarkan respons itu di-cache.
Masih tiada sokongan:
- Tidak semua framework sudah bersedia. Action Pack dalam Rails masih menolak
QUERYdengan status 405 (UnknownHttpMethod) sehingga sokongan eksplisit ditambah. - API gateway, WAF, CDN dan proksi korporat mungkin belum mengenali kaedah ini. Ini penting kerana request HTTP jarang bergerak terus daripada klien ke server. Ia mungkin melalui beberapa lapisan perantara yang mempunyai senarai kaedah HTTP tersendiri.
Patutkah anda menggunakannya sekarang?
Jawapan ringkasnya: jika anda mengawal kedua-dua hujung, boleh pertimbangkan.
Untuk API dalaman, komunikasi antara servis atau sistem yang mempunyai klien dan server sendiri, QUERY boleh menjadi pilihan yang menarik. Ia paling berguna apabila operasi itu memang bersifat bacaan tetapi query terlalu besar atau kompleks untuk diletakkan dalam URI.
Contohnya:
- carian dengan banyak penapis;
- query berstruktur;
- operasi geospatial;
- query ala-GraphQL;
- sistem dalaman yang memerlukan body untuk operasi bacaan.
Untuk API awam, keadaan masih berbeza.
Lebih selamat untuk menyediakan fallback seperti POST atau GET bergantung pada keperluan API anda. Jika server atau perantara mengembalikan 405 atau 501, klien boleh menggunakan kaedah alternatif yang disediakan.
PATCH sendiri mengambil masa yang lama untuk mendapat sokongan menyeluruh selepas diperkenalkan melalui RFC 5789 pada 2010. QUERY mungkin melalui proses yang sama: sokongan muncul dahulu di server, kemudian framework, kemudian infrastruktur seperti CDN dan proksi, dan akhirnya pelayar serta HTML.
Spesifikasi QUERY sendiri menyediakan mekanisme seperti Location dan Content-Location yang boleh membantu dalam proses peralihan kepada URI yang boleh diakses melalui GET.
Jadi, tidak perlu menukar semua API kepada QUERY sekarang. Untuk projek baharu yang mengawal keseluruhan stack, ia boleh diuji. Untuk API awam yang bergantung pada banyak lapisan pihak ketiga, tunggu sehingga sokongannya lebih meluas.
Kenapa QUERY dan bukan SEARCH?
HTTP Method Registry sebenarnya sudah mempunyai beberapa kaedah safe dan idempotent yang boleh membawa body, termasuk PROPFIND, REPORT dan SEARCH daripada dunia WebDAV.
Draf awal spesifikasi ini juga menggunakan nama SEARCH.
Akhirnya, QUERY dipilih kerana nama itu lebih jelas menggambarkan tujuan kaedah itu. Ia berkait terus dengan konsep query dalam HTTP dan tidak terlalu bergantung kepada sejarah WebDAV.
Ringkasnya: QUERY mengisi ruang yang selama ini agak janggal dalam HTTP: operasi bacaan yang memerlukan body. GET masih pilihan terbaik untuk kebanyakan permintaan biasa, manakala POST masih berguna apabila operasi tidak bersifat safe atau apabila infrastruktur belum menyokong QUERY.
Untuk aplikasi yang mempunyai query kompleks dan mengawal kedua-dua klien serta server, QUERY menawarkan semantik yang lebih tepat. Untuk API awam, masih terlalu awal untuk bergantung kepadanya sepenuhnya.
Standardnya sudah ada. Sekarang tinggal menunggu infrastruktur web mengejarnya.
Sumber
- IETF: RFC 10008: The HTTP QUERY Method
- IANA: Hypertext Transfer Protocol (HTTP) Method Registry
- nodejs/llhttp: llhttp: support http method query (PR #265)
- nodejs/node: nodejs/node PR #51719 (HTTP QUERY parser support)
- nodejs/undici: undici v8.6.0 release notes
- WHATWG: Fetch Standard (forbidden methods)
- IETF: RFC 5789: PATCH Method for HTTP
- unjs/h3: h3: Handle QUERY requests
- Microsoft Learn: HttpMethod.Query Property (.NET 10)
- rails/rails: Rails ActionDispatch request.rb (UnknownHttpMethod)
- expressjs/express: Express: Support HTTP QUERY method (issue #5615)
- Go: net/http Go package documentation
// penulis
Editor & Operator
Mohd Firdaus Abu Bakar (MrDodgerX) is an enterprise geospatial systems engineer in Malaysia and the editor behind hejes.my. He runs the briefing pipeline, curates and edits every draft, verifies each factual claim against primary sources, and presses the publish button — nothing ships without his review. He writes about AI, security and Malaysia's tech scene from a builder's perspective. Professional profile and code: the links below.
// sumber //
disahkan fakta · 09 SEP 2026 · hejes-content-fact-check
- RFC 10008: The HTTP QUERY MethodIETF · diakses 09 SEP 2026
- Hypertext Transfer Protocol (HTTP) Method RegistryIANA · diakses 09 SEP 2026
- llhttp: support http method query (PR #265)nodejs/llhttp · diakses 09 SEP 2026
- nodejs/node PR #51719 (HTTP QUERY parser support)nodejs/node · diakses 09 SEP 2026
- undici v8.6.0 release notesnodejs/undici · diakses 09 SEP 2026
- Fetch Standard (forbidden methods)WHATWG · diakses 09 SEP 2026
- RFC 5789: PATCH Method for HTTPIETF · diakses 09 SEP 2026
- h3: Handle QUERY requestsunjs/h3 · diakses 09 SEP 2026
- HttpMethod.Query Property (.NET 10)Microsoft Learn · diakses 09 SEP 2026
- Rails ActionDispatch request.rb (UnknownHttpMethod)rails/rails · diakses 09 SEP 2026
- Express: Support HTTP QUERY method (issue #5615)expressjs/express · diakses 09 SEP 2026
- net/http Go package documentationGo · diakses 09 SEP 2026
berkaitan //

Agen AI vs Laman Kerajaan: Apa Kata Log
Agen autonomous hantar 200,000 request ke laman Jabatan Pendidikan AS dan 13 payload ke arkib Kanada. Tiada data bocor — buktinya dari log orang lain.

Cloudflare jadi certificate authority post-quantum
Cloudflare merancang CA awam dengan bahan root GlobalSign dan Merkle Tree Certificates mulai Q1 2027 — TLS post-quantum yang masih berfungsi pada peranti lama.

Domain CDN Terbiar Didaftar Semula: Ribuan Laman Terdedah
Domain netdna-ssl.com milik MaxCDN yang mati didaftar semula oleh pihak ketiga dengan wildcard DNS, sedangkan ribuan laman serta dokumen masih memanggilnya.
// sertai suapan
satu ilmu seminggu. tiada spam.
ringkasan mingguan. berhenti bila-bila masa.