HTTP (HyperText Transfer Protocol, 超文本傳輸協議)是互聯網上應用最爲普遍的一種網絡協議,它是基於 TCP 的應用層協議,簡單地說就是客戶端和服務器進行通訊的一種規則,它的模式很是簡單,就是客戶端發起請求,服務器響應請求,以下圖所示:javascript
HTTP 最先於 1991 年發佈,是 0.9 版,不過目前該版本已再也不用。HTTP 目前在使用的版本主要有:css
HTTP 請求由三部分組成:html
如圖所示:java
下面是一個 HTTP GET 請求的例子:python
GET / HTTP/1.1
Host: httpbin.org
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475070272.1480418329; _gat=1複製代碼
上面的第一行就是一個請求行:nginx
GET / HTTP/1.1複製代碼
其中,GET
是請求方法,表示從服務器獲取資源;/
是一個請求地址;HTTP/1.1
代表 HTTP 的版本是 1.1。web
請求行後面的一系列鍵值對就是消息報頭:shell
Host: httpbin.org
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475034215.1480418329; _gat=1複製代碼
其中:數據庫
max-age=秒
表示資源在本地緩存多少秒;HTTP 經過不一樣的請求方法以多種方式來操做指定的資源,經常使用的請求方法以下表:json
方法 | 描述 |
---|---|
GET | 從服務器獲取指定(請求地址)的資源的信息,它一般只用於讀取數據,就像數據庫查詢同樣,不會對資源進行修改。 |
POST | 向指定資源提交數據(好比提交表單,上傳文件),請求服務器進行處理。數據被包含在請求正文中,這個請求可能會建立新的資源或更新現有的資源。 |
PUT | 經過指定資源的惟一標識(在服務器上的具體存放位置),請求服務器建立或更新資源。 |
DELETE | 請求服務器刪除指定資源。 |
HEAD | 與 GET 方法相似,從服務器獲取資源信息,和 GET 方法不一樣的是,HEAD 不含有呈現數據,僅僅是 HTTP 頭信息。HEAD 的好處在於,使用這個方法能夠在沒必要傳輸所有內容的狀況下,就能夠得到資源的元信息(或元數據)。 |
OPTIONS | 該方法可以使服務器傳回資源所支持的全部 HTTP 請求方法。 |
注意到,POST 和 PUT 均可用於建立或更新資源,然而,它們之間仍是有比較大的區別:
好比,往某個站點添加一篇文章,若是使用 POST 來建立資源,可相似這樣:
POST /articles HTTP/1.1
{
"author": "ethan",
"title": "hello world",
"content": "hello world"
}複製代碼
在上面,POST 對應的 URI 是 /articles
,它是資源的接收者,而非資源的標識,若是資源被成功建立,服務器能夠返回 201 Created
狀態以及新建資源的位置,好比:
HTTP/1.1 201 Created
Location: /articles/abcdef123複製代碼
咱們若是知道新建資源的標識符,能夠使用 PUT 來建立資源,好比:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello world",
"content": "hello world"
}複製代碼
在上面,PUT 對應的 URI 是 /articles/abcdef234
,它指明瞭資源的存放位置,若是資源被成功建立,服務器能夠返回 201 Created
狀態以及新建資源的位置,好比:
HTTP/1.1 201 Created
Location: /articles/abcdef234複製代碼
好比使用 PUT 更新地址爲 /articles/abcdef234
的文章的標題,咱們須要發送全部值:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello python",
"content": "hello world"
}複製代碼
而使用 POST,能夠更新某個域的值:
POST /articles/abcdef234 HTTP/1.1
{
"title": "hello python"
}複製代碼
HTTP 方法的冪等性是指一次和屢次請求某一個資源應該具備一樣的反作用,注意這裏是反作用,而不是返回結果。
GET 方法用於獲取資源,不會改變資源的狀態,不論調用一次仍是屢次都沒有反作用,所以它是冪等的;DELETE 方法用於刪除資源,有反作用,但調用一次或屢次都是刪除同個資源,產生的反作用是相同的,所以也是冪等的;POST 是不冪等的,由於兩次相同的 POST 請求會在服務器建立兩份資源,它們具備不一樣的 URI;PUT 是冪等的,對同一 URI 進行屢次 PUT 的反作用和一次 PUT 是相同的。
HTTP 響應與 HTTP 請求類似,由三部分組成:
如圖所示:
下面是一個 HTTP GET 請求的響應結果:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 29 Nov 2016 13:08:38 GMT
Content-Type: application/json
Content-Length: 203
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"User-Agent": "Paw/2.3.1 (Macintosh; OS X/10.11.3) GCDHTTPRequest"
},
"origin": "13.75.42.240",
"url": "https://httpbin.org/get"
}複製代碼
上面的第一行就是一個狀態行:
HTTP/1.1 200 OK複製代碼
其中,200
是狀態碼,表示客戶端請求成功,OK
是相應的狀態描述。
狀態碼是一個三位的數字,常見的狀態碼有如下幾類:
狀態行後面的一系列鍵值對就是消息報頭,即響應頭:
Server: nginx
Date: Tue, 29 Nov 2016 13:08:38 GMT
Content-Type: application/json
Content-Length: 203
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true複製代碼
其中:
本文由 funhacks 發表於我的博客,採用 Creative Commons BY-NC-ND 4.0(自由轉載-保持署名-非商用-禁止演繹)協議發佈。
非商業轉載請註明做者及出處。商業轉載請聯繫做者本人。
本文標題爲: HTTP 協議簡介
本文連接爲: funhacks.net/2017/03/01/…