標籤:

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 要上傳的數據

  1. 請求最多包含四部分,最少包含三部分。(也就是說第四部分可以為空)
  2. 第三部分永遠都是一個回車(
  3. 動詞有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
  4. 這裡的路徑包括「查詢參數」,但不包括「錨點」
  5. 如果你沒有寫路徑,那麼路徑默認為 /
  6. 第 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>

  1. GET 請求和 POST 請求對應的響應可以一樣,也可以不一樣
  2. 響應的第四部分可以很長很長很長

響應的格式

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 |