python模塊介紹-httplib:HTTP協議客戶端

python模塊介紹-httplib:HTTP協議客戶端 

注意:httplib模塊在Python3.0中已改名爲http.client。2to3腳本會自動修改import當你的源代碼轉換時到3.0時。html

httplib實現了HTTP和HTTPS的客戶端協議,通常不直接使用,在python更高層的封裝模塊中(urllib,urllib2)使用了它的HTTP和HTTPS實現。其中HTTPS須要socket編譯了SSL支持。HTTP類僅僅是和python1.5.2及之前的版本兼容,不推薦使用。python

代碼:Lib/httplib.pyshell

接口

基本類

  • class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]]) :數組

HttpConnection的實例表示與HTTP服務器的事務。實例化時須要傳遞主機和可選的端口號。若是沒有端口號,試圖以host:port格式從主機字符串提取,若是提取失敗則使用默認的HTTP端口(80)。參數strict默認爲false,表示在沒法解析狀態行時(status line)不能被HTTP/1.0或1.1解析時不拋出BadStatusLine異常;可選參數timeout表示即阻塞在多少秒後超時,若是沒有給出默認使用全局超時設置。可選參數source_address表示HTTP的源地址(host, port)。安全

timeout爲2.6添加,source_address爲2.7添加。服務器

>>> import httplib>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com')>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com:80')>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com',80)>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com',80, timeout=10)
  • class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address]]]]]])app

HttpConnection的子類,使用SSL與安全服務器通訊。默認端口爲443。key_file是包含PEM格式私鑰的文件名稱。 cert_file中是PEM格式的證書鏈文件。socket

注意不支持驗證服務器的證書。timeout爲2.6添加,source_address爲2.7添加。函數

  • class httplib.HTTPResponse(sock, debuglevel=0, strict=0)工具

實例鏈接成功以後返回的類,不能由用戶實例化。

  • class httplib.HTTPMessage

HTTPMessage實例用於保存HTTP響應頭。它使用mimetools.Message類實現,並提供了處理HTTP頭的工具函數。它不直接實例化的用戶。不能由用戶實例化。

異常

  • exception httplib.HTTPException

Exception的子類,此模塊中的其餘異常的基類。下面的類默認是該類的直接子類。

  • httplib.NotConnected

  • httplib.InvalidURL

  • httplib.UnknownProtocol

  • httplib.UnknownTransferEncoding

  • httplib.UnimplementedFileMode

  • httplib.IncompleteRead

  • httplib.ImproperConnectionState

  • httplib.CannotSendRequest

ImproperConnectionState的一個子類。

  • httplib.CannotSendHeader

ImproperConnectionState的一個子類。

  • httplib.ResponseNotReady

ImproperConnectionState的一個子類。

  • httplib.BadStatusLine

服務器返回的HTTP狀態碼不認識時產生。

常量和類變量

  • httplib.HTTP_PORT:HTTP協議的默認端口,恆爲80。

  • httplib.HTTPS_PORT:HTTPS協議的默認端口,恆爲443。

  • httplib.responses:映射HTTP1.1狀態代碼映射到W3C的名字的字典。2.5新增

>>> httplib.responses[httplib.NOT_FOUND]'Not Found'

HTTPConnection類的方法

  • HTTPConnection.request(method, url[, body[, headers]])

發送請求HTTP請求到服務器,使用方法method和指定的地址url。若是有body,通常是字符串數據,將在headers以後發送。固然body也能夠是支持fileno()和read()方法的文件對象,這時會發送文件內容。header內容長度會自動填充爲正確的值,headers是額外HTTP頭的映射,會和請求一塊兒發送。2.6開始支持文件對象。

  • HTTPConnection.getresponse()

用於在請求發送之後從服務器端獲取響應。返回HTTPResponse實例。注意發送下一條請求以前必須讀完整個響應。

  • HTTPConnection.set_debuglevel(level)

設置調試級別(調試輸出打印量)。默認的調試級別爲0 ,表示沒有調試輸出打印。

  • HTTPConnection.set_tunnel(host, port=None, headers=None)

設置HTTP鏈接隧道的主機和端口。須要經過代理服務器作HTTPS鏈接時使用。header參數必須爲額外HTTP頭的映射隨CONNECT一塊兒發送。2.7新增。

  • HTTPConnection.connect()

對象建立以後鏈接到指定的服務器。

  • HTTPConnection.close()

關閉到服務器的鏈接。

下面四個函數能夠代替request()一步步發送請求。

  • HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])

鏈接到服務器後的第一個調用。它發送由request字符串,selector字符串, HTTP版本(HTTP/1.1)的行數據到服務器。設置skip_host爲非Fasle值可禁用自動發送主機,設置skip_accept_encoding爲非Fasle值可禁用接受編碼。skip_accept_encoding爲2.4添加。

  • HTTPConnection.putheader(header, argument[, ...])

發送一個RFC 822樣式頭到服務器。它發送由header,一個冒號和一個空格,第一個參數到服務器。若是有更多參數會發送多行,每行由一個tab和一個參數組成。

  • HTTPConnection.endheaders(message_body=None)

發送空行到服務器,指示header的結束。可選的optional message_body參數能夠用來傳遞與請求相關的消息體。消息體若是是字符串將在消息頭的包發送,若是它是字符串,不然用單獨數據包。2.7加入message_body。

  • HTTPConnection.send(data)

將數據發送到服務器。endheaders()以後,getresponse()以前使用。

HTTPResponse類的方法

  • HTTPResponse.read([amt])

讀取並返回response的body,或下面的amt字節。

  • HTTPResponse.getheader(name[, default])

得到頭名,若是沒有匹配的頭返回default。

  • HTTPResponse.getheaders()

返回(header, value)元組構成的列表。2.4新增。

  • HTTPResponse.fileno()

返回底層套接字的的fileno。

  • HTTPResponse.msg

包含響應頭的mimetools.Message實例。

  • HTTPResponse.version

服務器使用的HTTP協議版本。10表示HTTP/1.011表示HTTP/1.1。

  • HTTPResponse.status

由服務器返回的狀態代碼。

  • HTTPResponse.reason

服務器的緣由短語。

實例

HTTP GET

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplibconn = httplib.HTTPConnection("www.python.org")conn.request("GET", "/index.html")r1 = conn.getresponse()print r1.status, r1.reason#data1 = r1.read()print data1
conn.request("GET", "/parrot.spam")r2 = conn.getresponse()print r2.status, r2.reason
data2 = r2.read()#print data2conn.close()

執行結果

# ./http_get.py 
200 OK
404 Not Found

HTTP HEAD

注意HEAD不會返回任何數據。

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplibconn = httplib.HTTPConnection("www.python.org")conn.request("HEAD","/index.html")res = conn.getresponse()print res.status, res.reason
data = res.read()print len(data)print data == ''conn.close()

執行結果

# ./http_head.py 
200 OK
0
True

HTTP POST

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplib, urllibparams = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})headers = {"Content-type": "application/x-www-form-urlencoded",
    "Accept": "text/plain"}conn = httplib.HTTPConnection("bugs.python.org")conn.request("POST", "", params, headers)response = conn.getresponse()print response.status, response.reason
data = response.read()print data
conn.close()

執行結果

# ./http_head.py 
# ./test.py 
302 Found
Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>

HTTP PUT

客戶端的HTTP PUT請求和POST相似。不一樣之處在於服務器端容許PUT建立資源。

>>> # This creates an HTTP message>>> # with the content of BODY as the enclosed representation>>> # for the resource http://localhost:8080/foobar...>>> import httplib>>> BODY = "***filecontents***">>> conn = httplib.HTTPConnection("localhost", 8080)>>> conn.request("PUT", "/file", BODY)>>> response = conn.getresponse()>>> print resp.status, response.reason200, OK

本文地址

參考資料

  • httplib python2文檔: hhttp://docs.python.org/2/library/httplib.html

  • 《The Python Standard Library by Example 2011》

相關文章
相關標籤/搜索