在傳統的 HTTP 協議中,GET
和 POST
是最常用於請求資料的兩種方法。然而,它們各自有著一定的侷限性。特別是當請求資料量較大時,透過 GET
方法將引數嵌入 URL 中顯得不夠靈活。另一方面,儘管 POST
方法允許在請求體中傳遞大量資料,卻無法保證操作的冪等性和安全性。
爲了彌補這些不足,HTTP 工作組提出了一種新的方法——QUERY
,該方法既能承載大量請求資料,又能保證請求的冪等性和安全性。
QUERY
方法的定義
QUERY
是一種安全且冪等的 HTTP 請求方法,它允許攜帶請求內容。與 GET
方法不同,QUERY
方法並不請求伺服器返回指定 URI 資源的表示,而是要求伺服器根據請求內容進行查詢操作。簡單來說,QUERY
方法透過請求體來定義查詢操作,並將操作結果作為響應返回。
使用場景
當請求引數較多或資料量較大時,透過 URL 傳遞引數顯得困難。這時,QUERY
方法能夠更好地解決此問題。舉個例子:
GET /search?q=example&limit=10&sort=desc HTTP/1.1 Host: conardli.top
如果查詢引數非常多,可能會導致 URL 長度超出限制,或者在某些系統中無法正常傳遞。這時可以使用 QUERY
方法:
QUERY /search HTTP/1.1 Host: conardli.top Content-Type: application/json { "q": "ConardLi", "limit": 17, "sort": "desc" }
以上程式碼展示瞭如何透過請求體傳遞引數,避免了 URL 過長的問題。
冪等性和安全性
與 POST
方法不同,QUERY
方法明確表示查詢操作是安全的,不會改變伺服器上的資源狀態。這意味著,無論請求多少次,伺服器資源的狀態都不會因為 QUERY
請求而發生變化。
另外,QUERY
方法的冪等性保證了相同的請求會得到相同的結果,這對於快取和自動重試等操作非常有用。
快取機制
QUERY
方法的響應是可快取的,快取機制與其他 HTTP 方法類似。爲了提高快取效率,應對請求內容進行規範化處理,例如移除內容編碼、基於格式規範化請求內容等。
Accept-Query
響應頭
伺服器可以透過在響應中包含 Accept-Query
頭欄位來明確支援 QUERY
方法,並指定可用的查詢格式媒體型別。例如:
Accept-Query: application/json, application/xml
示例
以下是一些 QUERY
方法的典型使用示例:
簡單查詢直接響應
QUERY /contacts HTTP/1.1 Host: conardli.top Content-Type: example/query Accept: text/csv select surname, givenname, email limit 17
響應:
HTTP/1.1 200 OK Content-Type: text/csv surname, givenname, email Smith, John, john.smith@conardli.top Jones, Sally, sally.jones@conardli.top Dubois, Camille, camille.dubois@example.net
帶有 Location
和 Content-Location
的響應
QUERY /contacts HTTP/1.1 Host: conardli.top Content-Type: example/query Accept: text/csv select surname, givenname, email limit 17
響應:
HTTP/1.1 200 OK Content-Type: text/csv Content-Location: /contacts/responses/42 Location: /contacts/queries/17 surname, givenname, email Smith, John, john.smith@conardli.top Jones, Sally, sally.jones@conardli.top Dubois, Camille, camille.dubois@example.net
透過 GET
請求 Content-Location
返回的資源,將得到相同的響應內容。
簡單查詢間接響應(303 See Other)
QUERY /contacts HTTP/1.1 Host: conardli.top Content-Type: example/query Accept: text/csv select surname, givenname, email limit 17
響應:
HTTP/1.1 303 See Other Location: http://conardli.top/contacts/query123
隨後,客戶端可以透過 GET
請求 Location
返回的資源來獲取查詢結果:
GET /contacts/query123 HTTP/1.1 Host: conardli.top Accept: text/csv
響應:
HTTP/1.1 200 OK Content-Type: text/csv surname, givenname, email Smith, John, john.smith@conardli.top Jones, Sally, sally.jones@conardli.top Dubois, Camille, camille.dubois@example.net
最後
與其他 HTTP 方法類似,QUERY
方法也需要注意一些安全性問題。例如,避免在 URL 中暴露敏感資訊,儘量使用請求體傳遞查詢引數。當伺服器建立臨時資源來表示 QUERY
請求結果時,應該避免在 URI 中以明文形式暴露原始請求內容。
QUERY
方法的引入為 HTTP 協議提供了更靈活的查詢機制,解決了大資料量請求傳遞的難題,同時保證了請求的安全性和冪等性。對於開發者來說,這是一種非常實用的方法,可以在各種應用場景中發揮作用。