1. 程式人生 > >HTTP 請求方法 GET、POST、PUT、DELETE 雜談

HTTP 請求方法 GET、POST、PUT、DELETE 雜談

什麼是HTTP?

HTTP的全稱是超文字傳輸協議,通俗的講它是一個客戶端和伺服器端請求和應答的標準,也是網際網路上應用最為廣泛的一種網路協議。

通常,由HTTP客戶端發起一個請求(請求報文),建立一個到伺服器指定埠(預設是80埠)的TCP連線。HTTP伺服器則在那個埠監聽客戶端傳送過來的請求。一旦收到請求,伺服器(向客戶端)發回一個響應報文。

HTTP的報文結構

參考我之前的一篇文章:HTTP報文結構及請求資料大小
簡單說明如下:
HTTP 請求報文

請求行
請求頭
(此處必須有一空行)
請求體

示例:

POST /user HTTP/1.1
Host: www.user.
com Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive (此處必須有一空行) name=world

HTTP 響應報文

響應行
響應頭
(此處必須有一空行)
響應體

示例:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
(此處必須有一空行)
helloworld!

HTTP的請求方法

HTTP/1.1協議中共定義了八種方法,來表明對 Request-URL 指定的資源不同請求方式。

1、OPTIONS
返回伺服器對指定資源提供的的 HTTP 請求方法。
2、HEAD
該方法與 GET 方法類似,獲取指定的資源,但該方法不返回請求體。
3、GET
獲取指定的資源,而且應該是安全的和冪等的。冪等是一個數學的概念,通俗的講就是一次請求和多次請求返回的結果是一致的。該方法一般用來查詢資料,但是需要考慮查詢條件的長度問題,參考

HTTP報文結構及請求資料大小,例如:

  • 根據使用者ID獲取使用者資訊,該介面只包含固定長度的使用者ID資訊,因此該介面可以使用 GET 方法提供服務。
  • 根據多個查詢條件獲取使用者列表資料,查詢條件可能會包含使用者姓名、單位名稱、崗位名稱等不確定的長度的欄位,不建議使用 GET 方法,建議使用 POST 方法。

4、POST
向指定資源提交資料進行請求處理,如:提交表單或者上傳檔案。
5、PUT
向指定資源上傳其最新內容。
6、DELETE
刪除指定的資源。
7、TRACE
回顯伺服器收到的請求,主要用於測試或診斷。
8、CONNECT
HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。

注意:
根據RFC2616,HTTP Method是區分大小寫的,而Header是不區分的。
當指定資源不支援對應的請求方法的時候,伺服器返回狀態碼405(Method Not Allowed)。
當伺服器不認識或者不支援對應的請求方法時,伺服器返回狀態碼501(Not Implemented)。

對於網上傳言的看法

1、GET、POST與安全沒有太大關係

從以下幾個方面講 POST 確實比 GET 安全一些:

  • GET 方法容易被瀏覽器快取
  • 在瀏覽器的歷史記錄中會保留請求的地址
  • 使用 GET 提交資料還可能會造成Cross-site request forgery攻擊。

上述內容只是些“小兒科”的解釋,對於真正意義上的安全起不到任何作用,比如:我對你的整個 HTTP 請求進行了代理,不管是 GET 還是 POST 方法提交的請求,所有資料一覽無餘。要正真的解決安全問題就需要用到對稱加密、非對稱加密、摘要演算法、數字簽名、數字證書。所以安全與 GET、POST基本沒有關係,對請求資訊、響應資訊進行加密才是最重要的。

2、 GET、POST對資料請求長度的限制

3、GET、POST與請求資料如何傳遞沒有關係

GET 和 POST 是由 HTTP 協議定義的。HTTP協議中沒有定義:GET請求的資料要放在URL中,POST請求的資料就要放在BODY中,而不能放在BODY中。是 HTML 標準對 GET、POST進行了以上的約定。現在的Web Server大都是支援GET中包含BODY這樣的請求。

總結:我們可以在 GET 請求中通過 body 傳遞引數,但是需要後端服務進行相應的解析,在複雜的網路環境中需要考慮中轉伺服器、代理伺服器對 body 資料的處理,避免參數丟失。