切換語言為:簡體
HTTP 將增加一個新的方法型別 QUERY!

HTTP 將增加一個新的方法型別 QUERY!

  • 爱糖宝
  • 2024-10-10
  • 2044
  • 0
  • 0

在傳統的 HTTP 協議中,GETPOST 是最常用於請求資料的兩種方法。然而,它們各自有著一定的侷限性。特別是當請求資料量較大時,透過 GET 方法將引數嵌入 URL 中顯得不夠靈活。另一方面,儘管 POST 方法允許在請求體中傳遞大量資料,卻無法保證操作的冪等性和安全性。

爲了彌補這些不足,HTTP 工作組提出了一種新的方法——QUERY,該方法既能承載大量請求資料,又能保證請求的冪等性和安全性。

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

帶有 LocationContent-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 協議提供了更靈活的查詢機制,解決了大資料量請求傳遞的難題,同時保證了請求的安全性和冪等性。對於開發者來說,這是一種非常實用的方法,可以在各種應用場景中發揮作用。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.