python網路程式設計 HTTP客戶端

2021-09-19 12:21:42 字數 1417 閱讀 6091

urllib和requests是python對http協議的應用,使用的兩個庫。urllib是python的標準內建庫,requests是乙個比urllib更強大的第三方庫。下面我們會使用乙個網域名稱為http:httpbin.org的小型測試**來測試這兩個http客戶端。

上面兩張分別是使用requests和urllib兩個庫進行http請求訪問從圖中我們已經可以看出來兩個庫的不同點了,requests支援gzip和deflate兩種壓縮格式的http響應,而urllib則不支援。還有,requests能夠自己確定正確的解碼方式,並將http響應從原始位元組轉換為文字;而urllib庫則只會返回原則是位元組,使用者需要自己進行解碼。

80埠是用於純文字http會話的標準埠。而有些客戶端則希望首先協商乙個加密的tls(安全傳輸層協議)會話。一旦加密連線建立完成,就使用http進行通訊。這是超文字傳輸安全協議(https,hypertext transfer protocol secure)的乙個變形,此時使用的標準埠是443埠。

tls的目的並不僅僅是保護資料在傳輸過程中不被竊聽,他也會對客戶端連線的伺服器進行驗證。當然如果客戶端也提供證書的話,tls也允許伺服器對客戶端身份進行驗證。

在http中,客戶端首先向會向伺服器傳送乙個獲取文件的請求(request)。一旦傳送完整個請求,客戶端就會進行等待,直到從伺服器接收到完整的響應為止。目前使用的http/1.1版本中還不允許客戶端在未收到完整的響應之前進行第二個請求。

http有一種很重要的平衡——請求和響應採取了相同的封幀規則。在對訊息體進行封幀時,有三種不同的方法可供選擇。

http請求中的第乙個單詞指定了客戶端請求伺服器時使用的操作型別。(如下圖)get和post是兩種最常見的方法。

get和post這兩種基本方法提供了http的基本「讀」和「寫」操作。

第乙個版本的http允許只在請求中包含方法名和路徑。

這在網際網路早起沒有問題,因為當時每台伺服器上只會託管乙個**。但是後來管理員開始希望在大型http伺服器上部署幾十上百個**,此時上述做法就行不通了。如果只提供路徑的話,伺服器難以推測使用者在url中輸入的是哪個主機名?尤其是現在幾乎每個**都有/這樣的路徑。

解決方法就是至少要強制使用host頭。現代http協議也要求提供協議版本,乙個請求至少需要提供下述資訊:

如果客戶端沒有提供host頭支援在url中使用的主機名,許多http伺服器就會發出乙個客戶端錯誤,通常是400 bad request。

下面是一些常見的狀態碼及其代表的含義:

Python網路程式設計 HTTP 一

傳送乙個簡單http get請求到遠端的服務 from urllib import request,parse base url being accessed url dictionary of qurey parameters parms encode the query string query...

python網路程式設計基礎 http

urllib.request.urlopen 方法傳送乙個get請求到伺服器,伺服器返回乙個httpresponse物件,這個httpresponse物件即是伺服器的響應報文。下例講述獲取httpresponse物件包含的具體內容。from urllib import request with re...

go網路程式設計 http程式設計

一 web工作流程 web伺服器的工作原理可以簡單歸納為 1.客戶端通過tcp ip協議與伺服器建立連線 2.客戶端向伺服器傳送http協議請求包,請求伺服器裡的文件資源 3.伺服器向客戶端傳送http協議應答包,如果請求的資源中包含動態語言的內容,那麼伺服器會呼叫動態語言的解釋引擎負責處理 動態內...