HTTP不權威簡介
HTTP 請求
客戶端發送一個HTTP請求到伺服器的請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。
Get請求例子
GET /562f25980001b1b106000338.jpg HTTP/1.1Host img.mukewang.comUser-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36Accept image/webp,image/*,*/*;q=0.8Referer http://www.imooc.com/Accept-Encoding gzip, deflate, sdchAccept-Language zh-CN,zh;q=0.8
第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.
GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最後一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部,緊接著請求行(即第一行)之後的部分,用來說明伺服器要使用的附加信息
從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,伺服器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,並且在每個請求中自動發送等等
第三部分:空行,請求頭部後面的空行是必須的
即使第四部分的請求數據為空,也必須有空行。
第四部分:請求數據也叫主體,可以添加任意的其他數據。
這個例子的請求數據為空。
POST請求例子
POST / HTTP1.1Host:www.wrox.comUser-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)Content-Type:application/x-www-form-urlencodedContent-Length:40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。第三部分:空行,第七行的空行。第四部分:請求數據,第八行。請求的格式
1 動詞 路徑 協議/版本2 Key1: value12 Key2: value22 Key3: value32 Content-Type: application/x-www-form-urlencoded2 Host: www.baidu.com2 User-Agent: curl/7.54.03 4 要上傳的數據
- 請求最多包含四部分,最少包含三部分。(也就是說第四部分可以為空)
- 第三部分永遠都是一個回車(
)
- 動詞有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
- 這裡的路徑包括「查詢參數」,但不包括「錨點」
- 如果你沒有寫路徑,那麼路徑默認為 /
- 第 2 部分中的 Content-Type 標註了第 4 部分的格式
用Chrome開發者工具查看 HTTP 請求內容
- 我們打開chrome開發者工具(F12),切換到Network
- 在chrome地址欄上輸入 https://www.baidu.com 進入百度
- 點擊第一條請求
- 找到Request Headers 點擊view source
以上是GET請求的查看,我們再看一下POST請求
- 我們點擊登錄,然後勾選 Preserve log,輸入賬號密碼後登錄
- 在茫茫多請求中找到一條POST請求
- 然後就可以查看這次登錄我們提交的信息咯
HTTP 響應
一般情況下,伺服器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
響應示例
HTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: private, no-cache, no-store, proxy-revalidate, no-transformConnection: Keep-AliveContent-Length: 2443 // 頁面長度Content-Type: text/html // 請求類型Date: Tue, 10 Oct 2017 09:14:05 GMTEtag: "5886041d-98b"Last-Modified: Mon, 23 Jan 2017 13:24:45 GMTPragma: no-cacheServer: bfe/1.0.8.18Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/<!DOCTYPE html><!--STATUS OK--><html> <head>
- GET 請求和 POST 請求對應的響應可以一樣,也可以不一樣
- 響應的第四部分可以很長很長很長
響應的格式
1 協議/版本號 狀態碼 狀態解釋2 Key1: value12 Key2: value22 Content-Length: 179312 Content-Type: text/html34 要下載的內容
- 狀態碼要背,是伺服器對瀏覽器說的話
- 1xx 不常用
- 2xx 表示成功
- 3xx 表示滾吧
- 4xx 表示你丫錯了
- 5xx 表示好吧,我錯了
- 狀態解釋沒什麼用
- 第 2 部分中的 Content-Type 標註了第 4 部分的格式
- 第 2 部分中的 Content-Type 遵循 MIME 規範
常見狀態碼:
200 OK //客戶端請求成功400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 403 Forbidden //伺服器收到請求,但是拒絕提供服務404 Not Found //請求資源不存在,eg:輸入了錯誤的URL500 Internal Server Error //伺服器發生不可預期的錯誤503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
用Chrome開發者工具查看 HTTP 響應內容
- 我們打開chrome開發者工具(F12),切換到Network
- 在chrome地址欄上輸入 https://www.baidu.com 進入百度
- 點擊第一條請求
- 找到Response Headers 點擊view source
- 點擊Response 查看返回數據
發一個GET/POST請求試試
打開命令行,輸入以下
curl -s -v -H "key: xxx" -- "https://www.baidu.com"
- 可以看到 > 後面的內容為此次請求的內容,< 後面為此次請求的響應內容
我們再發一條POST請求試試
curl -X -POST -s -v -H "key: xxx" -- "https://www.baidu.com"
可以看到POST請求返回的狀態碼為302
再加點東西,我們傳點data進去
curl -X -POST -d "1234567890" -s -v -H "key: xxx" -- "https://www.baidu.com"
可以看到請求的內容多了兩個欄位 Content-length 和 Content-Type,表示我們的data上傳成功了
實際工作中,我們也可以使用postman來發送GET,POST請求。
參考文章
- 關於HTTP協議,一篇就夠了
- HTTP狀態碼
推薦閱讀:
※Go Programming Language http
※Windows,Mac OSX和Linux平台設置HTTPS以及自簽名證書詳細指南
※HTTP伺服器的本質:tinyhttpd源碼分析及拓展
※HTTP的post和get
※流式處理對 請求/響應 正文數據體的影響
TAG:HTTP |