摘要:本文主要介紹HTTP的最基本的知識,包括request請求、response響應、常見的響應狀態碼、GET請求與POST請求的區別。
一、HTTP 請求
1. http請求操作/curl命令
-
curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://GET獲取操作
請求內容
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx
-
curl -X POST -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://POST上傳操作
請求內容
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx
-
curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://POST上傳帶數據
請求內容
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
yyy: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
1234567890
注:第二部分中,至少需要有Host
、Content-Length
、Content-Type
2. 綜上所得,請求一共包含以下部分
1 動詞 路徑 協議/版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.baidu.com
2 User-Agent: curl/7.54.0
3
4 要上傳的數據-
其中需要注意的是:
- 請求最多包含四部分,最少包含三部分,即第四部分數據可以為空。
- 第三部分永遠都是一個回車,用來分隔第二、第四部分。
- 第一部分的動詞包括
GET
(獲取)/POST
(上傳,新增)/PUT
(整體更新)/PATCH
(局部更新)/DELETE
(刪除)/HEAD
(獲取資源的元數據)/OPTIONS
(獲取信息,關于資源的哪些屬性是客戶端可以改變的)等。 - 如果沒有寫路徑,則默認為根目錄(即
/
) - 第二部分中的的 Content-Type 標注了第 4 部分的格式
- 第一部分的路徑,包含查詢參數,但不包括錨點
3. 使用Chrome瀏覽器查看http請求
- 打開 控制臺中的Network面板
- 地址欄輸入網址
- 在 Network 點擊,查看 request,點擊「view source」
- 如果有請求的第四部分,那么在 FormData 或 Payload 里面可以看到
舉例說明(百度首頁請求):
百度首頁請求
二、HTTP 響應
1.http響應出現在請求結束后
如curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://GET獲取操作
獲得的響應代碼為:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:14:05 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<!DOCTYPE html>
<html lang="en">
………………以下為網頁html代碼,略…………
</html>
2. http響應包含以下部分
- 1 協議/版本號 狀態碼 狀態解釋
2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html
3
4 要下載的內容 -
其中需要注意的是
第 2 部分中的 Content-Type 標注了第 4 部分的格式
第 2 部分中的 Content-Type 遵循 MIME 規范
第一部分的狀態解釋沒什么用
3. 關于響應的狀態碼
1xx消息:代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,并以空行結束。(不常用,大致知道即可)
-
2XX:表示成功
- 200 OK:請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
- 204 No Content:表示請求已成功處理,但是沒有內容返回,意思等同于請求執行成功,但是沒有數據,瀏覽器不用刷新頁面,也不用導向新的頁面。
- 206 Partial Content:服務器已經成功處理了部分GET請求。(客戶端進行了范圍請求) 響應報文中包含Content-Range指定范圍的實體內容。
-
3XX:重定向
- 301 Moved Permanently:表示訪問的資源被永久移除,即請求的資源已經永久的搬到了其他位置 。
- 302 Found :表示所訪問的資源臨時被移除,以后還會回來,即臨時重定向,表示請求的資源臨時搬到了其他位置 。
- 303 See Other :表示請求資源存在另一個URI,應使用GET定向獲取請求資源 。
- 304 Not Modified :表示資源未被修改,即客戶端仍然具有以前下載的副本,不需要重新傳輸資源。
- 307 Temporary Redirect:臨時重定向,和302有著相同含義 ,盡管302標準禁止POST變為GET,但沒人聽他的 ,而307就會遵照標準,不會從POST變為GET
但處理響應行為,各個瀏覽器可能不同。
-
4XX:客戶端錯誤
- 400 Bad Request:表示請求報文存在語法錯誤或參數錯誤,服務器不理解 ,服務器不應該重復提交這個請求 ,需要修改請求內容后再次發送。
- 401 Unauthorized:表示發送的請求需要有HTTP認證信息或者是認證失敗了 ,返回401的響應必須包含一個適用于被請求資源的WWW-Authenticate首部以質詢用戶信息 ,瀏覽器初次接受401時,會彈出認證窗口。
- 403 Forbidden :表示對請求資源的訪問被服務器拒絕了 ,服務器可以對此作出解釋,也可以不解釋 ,想說明的話可以在響應實體的主體部分描述原因 。比如說你可能沒有訪問權限。
- 404 Not Found:表示服務器找不到你請求的資源 ,但允許用戶的后續請求。
-
5XX:服務器錯誤
- 500 Internal Server Error:通用錯誤消息,服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤信息。
- 502 Bad Gateway:作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
- 503 Service Unavailable:表示服務器超負載或正停機維護,無法處理請求 ,如果服務器知道還需要多長時間,就寫入Retry-After首部字段返回。
4. 使用Chrome瀏覽器查看http響應
- 打開 Network
- 輸入網址
- 選中第一個響應
- 查看 Response Headers,點擊「view source」
- 你會看到響應的前兩部分
- 查看 Response 或者 Preview,你會看到響應的第 4 部分
舉個例子:百度首頁響應代碼
百度首頁響應代碼
三、GET 和 POST 的區別是什么
這是一個很常見的面試題,我這里總結的答案是:
- 參數。GET 的參數放在 url 的查詢參數里,POST 的參數(數據)放在請求消息體里。
-
安全。GET 沒有 POST 安全(當然實際上二者都沒有那么的安全)。因為GET請求很容易偽造(比如
<a>
、<img>
、<link>
、<script>
、<form>
標簽都可以發送GET請求)。 - 數據長度。GET 的參數(url查詢參數)有長度限制,一般是 1024 個字符。POST 的參數(數據)沒有長度限制(話雖這么說,但實際POST還是有4~10Mb 的限制,但是相對于GET已經大多了)
- 包。GET 請求只需要發一個包,POST 請求需要發兩個以上包(因為 POST 有消息體)(雖然GET 也可以用消息體但是不常用)
- 作用。GET 用來讀數據,POST 用來寫數據,POST 不冪等(冪等的意思就是不管發多少次請求,結果都一樣。)