httplib模組實現了HTTP和HTTPS的客戶端部分,但是一般不直接使用,經常通過urllib來進行HTTP,HTTPS的相關操作。
如果需要檢視其原始碼可以通過查詢命令定位:
find / -name "httplib.py"
整個請求過程的狀態轉移圖如下所示:
httplib提供如下的類:
1. httplib.
HTTPConnection
(host[, port[, strict[, timeout[, source_address]]]])
一個HTTPConnection
例項表示一次與HTTP server的連機事務,在例項化的時候至少需要一個主機地址。port引數如果沒有指定會預設採用80埠。strict引數的預設值是false,當這個值為true的時候,如果狀態行(status line)不是HTTP/1.0 or 1.1,則會引發BadStatusLine錯誤。timeout引數指定在多長時間後還未連線到主機則停止此聯機行為。source_address引數是二元組形式(host,port),指定發起連線的客戶機的IP和埠。
>>> h1 = httplib.HTTPConnection('www.cwi.nl') >>> h2 = httplib.HTTPConnection('www.cwi.nl:80') >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80) >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
其包含如下幾個方法:
1.1 HTTPConnection.
request
(method, url[, body[, headers]])
以method方法來訪問url地址,body引數可以是需要傳送的資料字串,還可以是檔案物件,其將會在傳送完headers之後傳送出去。headers引數對應HTTP headers中需要的內容。如果headers引數沒有指定,則headers中的Content-Length會根據body的大小自動新增(字串的長度或者是檔案的大小)。
1.2 HTTPConnection.
getresponse
()
一般在呼叫request之後用來獲取返回結果,此方法返回一個HTTPResponse物件。
注意: 在傳送一個新的請求之前要先讀取返回的結果,否則會出錯。原始檔中對應的部分如下:
# Note: if a prior response exists, then we *can* start a new request. # We are not allowed to begin fetching the response to this new # request, however, until that prior response is complete. # if self.__state == _CS_IDLE: self.__state = _CS_REQ_STARTED else: raise CannotSendRequest()
測試例項:
1.3 HTTPConnection.
set_debuglevel
(level)
設定除錯級別(相關的除錯資訊會列印出來),預設值是0,表示不列印除錯資訊。
In [14]: con = httplib.HTTPConnection("www.baidu.com") In [15]: con.set_debuglevel(1) # 請求過程中會輸出一些調式資訊 In [16]: req = con.request("GET","/") send: 'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nAccept-Encoding: identity\r\n\r\n'
1.4 HTTPConnection.
connect
()
當HTTPConnection
物件建立的時候自動連線到伺服器
1.5 HTTPConnection.
close
()
你懂的
你除了直接呼叫request
()方法來訪問伺服器,還可以以下邊4步實現此功能:
1.6.1 HTTPConnection.
putrequest
(request, selector[, skip_host[, skip_accept_encoding]]):
這是連線到伺服器之後的第一步操作
1.6.2 HTTPConnection.
putheader
(header, argument[, ...])
傳送請求頭
1.6.3 HTTPConnection.
endheaders
(message_body=None)
向伺服器傳送一空行表示請求頭的結束。
1.6.4 HTTPConnection.
send
(data)
向伺服器傳送資料。應該在endheaders函式呼叫之後,getresponse函式之前呼叫。
2. httplib.
HTTPSConnection
(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])
這是HTTPConnection
的一個子類,通過SSL來和安全主機互動,採用的預設埠是443.如果引數context指定時候,這其此引數必須是ssl.SSLContext(描述SSL的各種資訊)
的例項。
key_file和cert_file引數已經棄用。
3. httplib.
HTTPResponse
(sock, debuglevel=0, strict=0)
這個類會在成功連線後返回,不會被使用者直接初始化。
HTTPResponse.
read
([amt]):
返回響應結果,或者讀取下amt個位元組
In [23]: response = con.getresponse() In [24]: response.read(10) Out[24]: '<!DOCTYPE '
HTTPResponse.
getheader
(name[, default])
獲取指定檔案頭中指定的內容
In [26]: response.getheader("server") Out[26]: 'BWS/1.1' In [27]: response.getheader("date") Out[27]: 'Mon, 17 Oct 2016 10:59:40 GMT' In [28]: response.getheader("Date") Out[28]: 'Mon, 17 Oct 2016 10:59:40 GMT'
HTTPResponse.
getheaders
()
獲取檔案頭的列表
HTTPResponse.
fileno
()
獲取socket的檔案描述符
HTTPResponse.
msg
-
獲取包含響應頭的
mimetools.Message
的例項In [30]: message = response.msg In [31]: message Out[31]: <httplib.HTTPMessage instance at 0x39610e0>
# 獲取響應頭資訊
In [33]: dict = message.dict In [34]: dict Out[34]: {'accept-ranges': 'bytes', 'cache-control': 'no-cache', 'connection': 'Keep-Alive', 'content-length': '14613', 'content-type': 'text/html', 'date': 'Mon, 17 Oct 2016 10:59:40 GMT', 'last-modified': 'Thu, 13 Oct 2016 05:07:00 GMT', 'p3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'pragma': 'no-cache', 'server': 'BWS/1.1', 'set-cookie': 'BAIDUID=6C2B1FF908F1DD87C092C282D6F1EE2A:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6C2B1FF908F1DD87C092C282D6F1EE2A; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1476701980; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'vary': 'Accept-Encoding', 'x-ua-compatible': 'IE=Edge,chrome=1'}
HTTPResponse.
status
HTTP的狀態碼
HTTPResponse.
reason
In [35]: response.reason Out[35]: 'OK'
4. httplib.
HTTPMessage
這個類中儲存HTTP的響應頭資訊。其通過 mimetools.Message實現,並提供處理頭的使用函式,不會被使用者例項化。
參考地址: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection