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的區別
先說結果,Get
和Post
並沒有本質的區別,只是報文格式不同。
Get
和Post
只是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。當然,這需要服務端支援。