在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ HTTP 協(xié)議簡介
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測試
使用 @property
標準模塊
陌生的 metaclass
Base64
進程、線程和協(xié)程
讀寫二進制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡介
Requests 庫的使用
讀寫文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級特性
線程
argparse
生成器
結(jié)束語
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

HTTP 協(xié)議簡介

HTTP (HyperText Transfer Protocol, 超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,它是基于 TCP應(yīng)用層協(xié)議,簡單地說就是客戶端和服務(wù)器進行通信的一種規(guī)則,它的模式非常簡單,就是客戶端發(fā)起請求,服務(wù)器響應(yīng)請求,如下圖所示:

HTTP 最早于 1991 年發(fā)布,是 0.9 版,不過目前該版本已不再用。HTTP 目前在使用的版本主要有:

  • HTTP/1.0,于 1996 年 5 月發(fā)布,引入了多種功能,至今仍在使用當中。
  • HTTP/1.1,于 1997 年 1 月發(fā)布,持久連接被默認采用,是目前最流行的版本。
  • HTTP/2 ,于 2015 年 5 月發(fā)布,引入了服務(wù)器推送等多種功能,是目前最新的版本。

HTTP 請求

HTTP 請求由三部分組成:

  • 請求行:包含請求方法、請求地址和 HTTP 協(xié)議版本
  • 消息報頭:包含一系列的鍵值對
  • 請求正文(可選):注意和消息報頭之間有一個空行

如圖所示:

下面是一個 HTTP GET 請求的例子:

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

上面的第一行就是一個請求行

GET / HTTP/1.1

其中,GET 是請求方法,表示從服務(wù)器獲取資源;/ 是一個請求地址;HTTP/1.1 表明 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.475034215.1480418329; _gat=1

其中:

  • Host 是請求報頭域,用于指定被請求資源的 Internet 主機和端口號,它通常從 HTTP URL 中提取出來;
  • Connection 表示連接狀態(tài),keep-alive 表示該連接是持久連接(persistent connection),即 TCP 連接默認不關(guān)閉,可以被多個請求復(fù)用,如果客戶端和服務(wù)器發(fā)現(xiàn)對方有一段時間沒有活動,就可以主動關(guān)閉連接;
  • Cache-Control 用于指定緩存指令,它的值有 no-cache, no-store, max-age 等,max-age=秒表示資源在本地緩存多少秒;
  • User-Agent 用于標識請求者的一些信息,比如瀏覽器類型和版本,操作系統(tǒng)等;
  • Accept 用于指定客戶端希望接受哪些類型的信息,比如 text/html, image/gif 等;
  • Accept-Encoding 用于指定可接受的內(nèi)容編碼;
  • Accept-Language 用于指定可接受的自然語言;
  • Cookie 用于維護狀態(tài),可做用戶認證,服務(wù)器檢驗等,它是瀏覽器儲存在用戶電腦上的文本片段;

HTTP 請求方法

HTTP 通過不同的請求方法以多種方式來操作指定的資源,常用的請求方法如下表:

方法 描述
GET 從服務(wù)器獲取指定(請求地址)的資源的信息,它通常只用于讀取數(shù)據(jù),就像數(shù)據(jù)庫查詢一樣,不會對資源進行修改。
POST 向指定資源提交數(shù)據(jù)(比如提交表單,上傳文件),請求服務(wù)器進行處理。數(shù)據(jù)被包含在請求正文中,這個請求可能會創(chuàng)建新的資源或更新現(xiàn)有的資源。
PUT 通過指定資源的唯一標識(在服務(wù)器上的具體存放位置),請求服務(wù)器創(chuàng)建或更新資源。
DELETE 請求服務(wù)器刪除指定資源。
HEAD 與 GET 方法類似,從服務(wù)器獲取資源信息,和 GET 方法不同的是,HEAD 不含有呈現(xiàn)數(shù)據(jù),僅僅是 HTTP 頭信息。HEAD 的好處在于,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲得資源的元信息(或元數(shù)據(jù))。
OPTIONS 該方法可使服務(wù)器傳回資源所支持的所有 HTTP 請求方法。

HTTP 響應(yīng)

HTTP 響應(yīng)與 HTTP 請求相似,由三部分組成:

  • 狀態(tài)行:包含 HTTP 協(xié)議版本、狀態(tài)碼和狀態(tài)描述,以空格分隔
  • 響應(yīng)頭:即消息報頭,包含一系列的鍵值對
  • 響應(yīng)正文:返回內(nèi)容,注意和響應(yīng)頭之間有一個空行

如圖所示:

下面是一個 HTTP GET 請求的響應(yīng)結(jié)果:

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"
}

上面的第一行就是一個狀態(tài)行

HTTP/1.1 200 OK

其中,200 是狀態(tài)碼,表示客戶端請求成功,OK 是相應(yīng)的狀態(tài)描述。

狀態(tài)碼是一個三位的數(shù)字,常見的狀態(tài)碼有以下幾類:

  • 1XX 消息 -- 請求已被服務(wù)接收,繼續(xù)處理
  • 2XX 成功 -- 請求已成功被服務(wù)器接收、理解、并接受
    • 200 OK
    • 201 Created 已創(chuàng)建
    • 202 Accepted 接收
    • 203 Non-Authoritative Information 非認證信息
    • 204 No Content 無內(nèi)容
  • 3XX 重定向 -- 需要后續(xù)操作才能完成這一請求
    • 301 Moved Permanently 請求永久重定向
    • 302 Moved Temporarily 請求臨時重定向
    • 304 Not Modified 文件未修改,可以直接使用緩存的文件
    • 305 Use Proxy 使用代理
  • 4XX 請求錯誤 -- 請求含有詞法錯誤或者無法被執(zhí)行
    • 400 Bad Request 由于客戶端請求有語法錯誤,不能被服務(wù)器所理解
    • 401 Unauthorized 請求未經(jīng)授權(quán)。這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
    • 403 Forbidden 服務(wù)器收到請求,但是拒絕提供服務(wù)。服務(wù)器通常會在響應(yīng)正文中給出不提供服務(wù)的原因
    • 404 Not Found 請求的資源不存在,例如,輸入了錯誤的URL
  • 5XX 服務(wù)器錯誤 -- 服務(wù)器在處理某個正確請求時發(fā)生錯誤
    • 500 Internal Server Error 服務(wù)器發(fā)生不可預(yù)期的錯誤,導(dǎo)致無法完成客戶端的請求
    • 503 Service Unavailable 服務(wù)器當前不能夠處理客戶端的請求,在一段時間之后,服務(wù)器可能會恢復(fù)正常
    • 504 Gateway Time-out 網(wǎng)關(guān)超時

狀態(tài)行后面的一系列鍵值對就是消息報頭,即響應(yīng)頭:

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

其中:

  • Server 包含了服務(wù)器用來處理請求的軟件信息,跟請求報頭域 User-Agent 相對應(yīng);
  • Content-Type 用于指定發(fā)送給接收者(比如瀏覽器)的響應(yīng)正文的媒體類型,比如 text/html, text/css, image/png, image/jpeg, video/mp4, application/pdf, application/json 等;
  • Content-Length 指明本次回應(yīng)的數(shù)據(jù)長度;

再議 POST 和 PUT

注意到,POST 和 PUT 都可用于創(chuàng)建或更新資源,然而,它們之間還是有比較大的區(qū)別:

  • POST 所對應(yīng)的 URI 并非創(chuàng)建的資源本身,而是資源的接收者,資源本身的存放位置由服務(wù)器決定;而 PUT 所對應(yīng)的 URI 是要創(chuàng)建或更新的資源本身,它指明了具體的存放位置

比如,往某個站點添加一篇文章,如果使用 POST 來創(chuàng)建資源,可類似這樣:

POST /articles HTTP/1.1

{
    "author": "ethan",
    "title": "hello world",
    "content": "hello world"
}

在上面,POST 對應(yīng)的 URI 是 /articles,它是資源的接收者,而非資源的標識,如果資源被成功創(chuàng)建,服務(wù)器可以返回 201 Created 狀態(tài)以及新建資源的位置,比如:

HTTP/1.1 201 Created
Location: /articles/abcdef123

我們?nèi)绻佬陆ㄙY源的標識符,可以使用 PUT 來創(chuàng)建資源,比如:

PUT /articles/abcdef234 HTTP/1.1

{
    "author": "peter",
    "title": "hello world",
    "content": "hello world"
}

在上面,PUT 對應(yīng)的 URI 是 /articles/abcdef234,它指明了資源的存放位置,如果資源被成功創(chuàng)建,服務(wù)器可以返回 201 Created 狀態(tài)以及新建資源的位置,比如:

HTTP/1.1 201 Created
Location: /articles/abcdef234
  • 使用 PUT 更新某一資源,需要更新資源的全部屬性;而使用 POST,可以更新全部或一部分值

比如使用 PUT 更新地址為 /articles/abcdef234 的文章的標題,我們需要發(fā)送所有值:

PUT /articles/abcdef234 HTTP/1.1

{
    "author": "peter",
    "title": "hello python",
    "content": "hello world"
}

而使用 POST,可以更新某個域的值:

POST /articles/abcdef234 HTTP/1.1

{
    "title": "hello python"
}
  • POST 是不冪等的,PUT 是冪等的,這是一個很重要的區(qū)別

HTTP 方法的冪等性是指一次和多次請求某一個資源應(yīng)該具有同樣的副作用,注意這里是副作用,而不是返回結(jié)果。

GET 方法用于獲取資源,不會改變資源的狀態(tài),不論調(diào)用一次還是多次都沒有副作用,因此它是冪等的;DELETE 方法用于刪除資源,有副作用,但調(diào)用一次或多次都是刪除同個資源,產(chǎn)生的副作用是相同的,因此也是冪等的;POST 是不冪等的,因為兩次相同的 POST 請求會在服務(wù)器創(chuàng)建兩份資源,它們具有不同的 URI;PUT 是冪等的,對同一 URI 進行多次 PUT 的副作用和一次 PUT 是相同的。

HTTP 特點

  • 客戶端/服務(wù)器模式
  • 簡單快速:客戶端向服務(wù)器請求服務(wù)時,通過傳送請求方法、請求地址和數(shù)據(jù)體(可選)即可
  • 靈活:允許傳輸任意類型的數(shù)據(jù)對象,通過 Content-Type 標識
  • 無狀態(tài):對事物處理沒記憶能力

小結(jié)

  • HTTP 是在網(wǎng)絡(luò)上傳輸 HTML 的協(xié)議,用于瀏覽器和服務(wù)器的通信,默認使用 80 端口。
  • URL 地址用于定位資源,HTTP 中的 GET, POST, PUT, DELETE 用于操作資源,比如查詢,增加,更新等。
  • GET, PUT, DELETE 是冪等的,POST 是不冪等的。
  • POST VS PUT
    • 使用 PUT 創(chuàng)建資源需要提供資源的唯一標識(具體存放位置),POST 不需要,POST 的數(shù)據(jù)存放位置由服務(wù)器自己決定
    • 使用 PUT 更新某一資源,需要更新資源的全部屬性;而使用 POST,可以更新全部或一部分值
    • POST 是不冪等的,PUT 是冪等的,這是一個很重要的區(qū)別
  • GET 可提交的數(shù)據(jù)量受到 URL 長度的限制,HTTP 協(xié)議規(guī)范沒有對 URL 長度進行限制,這個限制是特定的瀏覽器及服務(wù)器對它的限制。
  • 理論上講,POST 是沒有大小限制的,HTTP 協(xié)議規(guī)范也沒有進行大小限制,出于安全考慮,服務(wù)器軟件在實現(xiàn)時會做一定限制。

參考資料