1. 程式人生 > 其它 >HTTP狀態碼以及Get和Post的區別

HTTP狀態碼以及Get和Post的區別

技術標籤:html

什麼是HTTP

HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是因特網上應用最為廣泛的一種網路傳輸協議,所有的WWW檔案都必須遵守這個標準。HTTP的最初目的是讓研究者,共享知識資訊,它是一種用於文件傳輸的協議。

HTTP請求方法

  • GET :獲取資源
  • HEAD:獲取資源的元資訊
  • POST:提交/上傳資料
  • PUT:修改資料
  • DELETE:刪除資源(幾乎用不到,一般發請求交給後端處理)
  • CONNECT:建立連線渠道,用於代理伺服器
  • OPTIONS:列出可對資源實施的請求方法,用來跨域請求
  • TRACE:追蹤請求響應的傳輸路徑

HTTP優缺點

優點

1.靈活可拓展

:一個是語義上的自由,另一個是傳輸形式的多樣性,不僅可以傳輸文字,還可以傳輸圖片視訊等資料。
2.可靠傳輸:HTTP基於TCP/IP,把它的傳輸特效繼承下來了。
3.無狀態:HTTP的每次請求都是獨立的、無關的,預設不需要儲存狀態資訊。

缺點

1.無狀態:在需要長連線的場景中,HTTP每次傳輸需要儲存大量的上下文資訊,這會導致大量資訊重複,在這種場景下,無狀態就是缺點了。
2.明文傳輸:在協議裡面的報文不使用二進位制資料而是用明文傳輸,容易造成資料劫持。
3.隊頭阻塞問題:當HTTP開啟長連線後,會共用一個TCP連線,同一時刻只能處理一個請求,在當前請求時間過長的情況下,其他請求只能處於阻塞狀態。

HTTP狀態碼

HTTP狀態碼為 3 位數,被歸為 5 類:

1XX:表示目前是協議處理的中間狀態,還需要後續操作。

  • 101 Switching Protocols:在 HTTP 升級為 WebSocket 的時候,如果伺服器同意變更,就會發送狀態碼為 101。

2XX:表示成功狀態。

  • 200 OK:請求成功狀態碼,響應體中含有資料。
    在這裡插入圖片描述

  • 204 No Content:含義同 200,但是響應報文不含實體的主體部分。

  • 206 Partial Content:表示部分內容請求成功。使用場景為 HTTP 分塊下載和斷點續傳,當然也會帶上相應的響應頭欄位 Content-Range。

3XX:重定向狀態,資源位置發生變動,需要重新請求。

  • 301 Move Permanently:永久重定向。HTTP 升級 HTTPS,之前站點再也不用,那就是 301。

  • 302 Found:臨時重定向。當前站點暫時不可用,那就是 302,後續可能換回來。
    在這裡插入圖片描述

  • 304 Not Modified:當命中協商快取時會返回這個狀態碼。
    在這裡插入圖片描述

4XX:請求報文有誤。

  • 400 Bad Request:請求無效。通常為前後端資料格式不一致或者其他原因。
  • 403 Forbidden:伺服器已經得到請求,但是拒絕執行,比如沒許可權、法律禁止等。
  • 404 Not Found:資源未找到,伺服器不存在對應的資源。
    在這裡插入圖片描述

5XX:伺服器端發生錯誤。

  • 500 Internal Server Error:伺服器報錯。
    在這裡插入圖片描述

  • 502 Bad Gateway:伺服器正常,但是訪問出錯。

  • 503 Service Unavailable:伺服器繁忙或者停機維護,暫時無法處理請求。

Get和Post的區別

先說結果,GetPost並沒有本質的區別,只是報文格式不同。

GetPost只是HTTP協議中的兩種請求方式,而HTT協議是基TCP/IP傳輸協議,它們用的同一個傳輸層協議,所以在傳輸層面上並沒有區別。

報文格式上,不帶引數時,最大區別就是第一行方法名不同。
POST方法請求報文第一行是這樣的 POST /uri HTTP/1.1 \r\n

GET方法請求報文第一行是這樣的 GET /uri HTTP/1.1 \r\n

帶引數時報文的區別呢? 在約定中,GET 方法的引數應該放在 url 中,POST 方法引數應該放在 body 中

舉個例子,如果引數是 name=lwf, age=23。

GET 方法簡約版報文是這樣的:

GET /get?name=lwf&age=23 HTTP/1.1
Host: localhost

POST 方法簡約版報文是這樣的:

POST /post HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=lwf&age=23

由於兩種方法本質上是 TCP 連線,沒有差別,也就是說,如果不按規範來也是可以的。可以在 URL 上寫引數,然後方法使用 POST;也可以在 Body 寫引數,然後方法使用 GET。當然,這需要服務端支援。