HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。html
HTTP 協議是以 ASCII 碼傳輸,創建在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:狀態行、請求頭、消息主體。相似於下面這樣:python
<method> <request-URL> <version> <headers>
<entity-body>
HTTP定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET
,POST
,PUT
,DELETE
。URL
全稱是資源描述符,咱們能夠這樣認爲:一個URL
地址,它用於描述一個網絡上的資源,而 HTTP 中的GET
,POST
,PUT
,DELETE
就對應着對這個資源的查,增,改,刪4個操做。瀏覽器
1. GET:安全
GET請求報文示例:服務器
GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive
POST表示可能修改變服務器上的資源的請求。網絡
POST / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive sex=man&name=Professional
咱們知道 HTTP 協議採用「請求-應答」模式,當使用普通模式,即非 Keep-Alive 模式時,每一個請求/應答客戶和服務器都要新建一個鏈接,完成以後當即斷開鏈接(HTTP協議爲無鏈接的協議);當使用 Keep-Alive 模式(又稱持久鏈接、鏈接重用)時,Keep-Alive 功能使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive 功能避免了創建或者從新創建鏈接。app
HTTP Keep-Alive 簡單說就是保持當前的TCP鏈接,避免了從新創建鏈接。編碼
HTTP 長鏈接不可能一直保持,例如 Keep-Alive: timeout=5, max=100
,表示這個TCP通道能夠保持5秒,max=100,表示這個長鏈接最多接收100次請求就斷開。url
HTTP是一個無狀態協議,這意味着每一個請求都是獨立的,Keep-Alive沒能改變這個結果。另外,Keep-Alive也不能保證客戶端和服務器之間的鏈接必定是活躍的,在HTTP1.1版本中也如此。惟一能保證的就是當鏈接被關閉時你能獲得一個通知,因此不該該讓程序依賴於Keep-Alive的保持鏈接特性,不然會有意想不到的後果。code
使用長鏈接以後,客戶端、服務端怎麼知道本次傳輸結束呢?兩部分:1. 判斷傳輸數據是否達到了Content-Length 指示的大小;2. 動態生成的文件沒有 Content-Length ,它是分塊傳輸(chunked),這時候就要根據 chunked 編碼來判斷,chunked 編碼的數據在最後有一個空 chunked 塊,代表本次傳輸數據結束,詳見這裏。什麼是 chunked 分塊傳輸呢?下面咱們就來介紹
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操做
4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
urllib 和urllib2之間的區別是:
在python2中,urllib和urllib2都是接受URL請求的相關模塊,可是提供了不一樣的功能。兩個最顯著的不一樣以下:
一、urllib2能夠接受一個Request類的實例來設置URL請求的headers
2urllib僅能夠接受URL。這意味着,你不能夠假裝你的User Agent字符串等。
可是urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是就是爲什麼urllib常和urllib2一塊兒使用的緣由。
python urllib2直接open和經過request再open有什麼區別。
http://zhuoqiang.me/python-urllib2-usage.html
HTTP容許傳輸任意類型的數據對象