深入理解Python3中的http.client模塊
http 模塊簡(jiǎn)介
Python3 中的 http 包中含有幾個(gè)用來(lái)開(kāi)發(fā) HTTP 協(xié)議的模塊。
- http.client 是一個(gè)底層的 HTTP 協(xié)議客戶端,被更高層的 urllib.request 模塊所使用。
- http.server 包含基于 socketserver 的基本 HTTP 服務(wù)器的類。
- http.cookies 實(shí)現(xiàn) cookie 狀態(tài)管理
- http.cookiejar 與 cookie 相關(guān)
http 模塊還定義了一系列的 HTTP 狀態(tài)碼。
HTTPStatus 類是在 Python 3.5 版本中新增的。
>>> from http import HTTPStatus >>> HTTPStatus.OK<HTTPStatus.OK: 200> >>> HTTPStatus.OK == 200True >>> http.HTTPStatus.OK.value200 >>> HTTPStatus.OK.phrase'OK' >>> HTTPStatus.OK.description'Request fulfilled, document follows' >>> list(HTTPStatus)[<HTTPStatus.CONTINUE: 100>, <HTTPStatus.SWITCHING_PROTOCOLS: 101>, ...]
具體的 HTTP 狀態(tài)碼和相應(yīng)的說(shuō)明可以在 Python 的官方文檔上找到: https://docs.python.org/3/library/http.html
http.client 模塊
http.client 模塊定義了實(shí)現(xiàn) http 和 https 協(xié)議客戶端的類。
該模塊通常不會(huì)直接使用,而是用封裝好的 urllib.request 模塊來(lái)使用他們處理 URL 。
常量
http 模塊中的常量:
1、http.client.HTTP_PORT
http 協(xié)議默認(rèn)的端口號(hào),總是 80 端口
2、http.client.HTTPS_PORT
https 協(xié)議默認(rèn)的端口號(hào),總是 443 端口
3、http.client.responses
將 HTTP 1.1 狀態(tài)碼映射到 W3C 名字的字典。
例如:
http.client.responses[http.client.NOT_FOUND] is 'Not Found'
基本類
HTTPConnection 類
http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None)
HTTPConnection 實(shí)例表示與 HTTP 服務(wù)器的事務(wù)。
實(shí)例化 HTTPConnection 時(shí)應(yīng)該傳遞一個(gè)主機(jī)和可選的端口號(hào)。如果沒(méi)有傳遞端口,而主機(jī)字符串是以 host:port 的形式,則會(huì)提取出端口值,否則將使用默認(rèn)的 8- 端口。
如果給定了可選參數(shù) timeout ,阻塞操作將會(huì)在給定的時(shí)間后超時(shí),若未給定,則使用默認(rèn)的全局 timeout 設(shè)置。
可選參數(shù) source_address 應(yīng)該以 host 和 port 的元組形式 (host,port),用來(lái)作為 HTTP 連接的源地址。
示例代碼如下:
>>> h1 = http.client.HTTPConnection('www.python.org') >>> h2 = http.client.HTTPConnection('www.python.org:80')>>> h3 = http.client.HTTPConnection('www.python.org', 80) >>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
source_address 是在 3.2 版本中添加的。
strict 參數(shù)在 3.4 版本中移除了。
HTTPSConnection 類
HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None)
HTTPSConnection 是 HTTPConnection 的子類,使用 SSL 與安全服務(wù)器聯(lián)系。
默認(rèn)的端口是 443 端口。如果指定了 context ,必須是 ssl.SSLContext 類的實(shí)例來(lái)描述不同的 SSL 選項(xiàng)。
key_file 和 cert_file 已經(jīng)被棄用了,取而代之的是 ssl.SSLContext.load_cert_chain() ?;蛘呤褂?ssl.create_default_context() 選擇系統(tǒng)信任的 CA 證書(shū)。
check_hostname 參數(shù)也被棄用了,使用 context 的 ssl.SSLContext.check_hostname 屬性。
HTTPResponse 類
class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)
一旦連接成功就會(huì)返回該實(shí)例,該類的對(duì)象不能由用戶直接實(shí)例化。
HTTPMessage 類
HTTPMessage 實(shí)例持有從 HTTP response 返回的頭部。
異常類
HTTPException 類
Exception 類的子類,也是 http 模塊中其他異常類的基類。
其他異常類:
- NotConnected
- InvalidURL
- UnknownProtocol
- UnknownTransferEncoding
- UnimplementedFileMode
- IncompletedRead
- ImproperConnectionState
- BadStatusLine
- LineTooLong
- CannotSendRequest
- CannotSendHeader
- ResponseNotReady
- RemoteDisconnected
類方法
HTTPConnection 對(duì)象方法
HTTPConnection 實(shí)例有如下的方法 :
1、HTTPConnection.request(method, url, body=None, headers={})
使用指定的 method 方法和 url 鏈接向服務(wù)器發(fā)送請(qǐng)求。
如果指定 了body 部分,那么 body 部分將在 header 部分發(fā)送完之后發(fā)送過(guò)去。body 部分可以是一個(gè)字符串、字節(jié)對(duì)象、文件對(duì)象或者是字節(jié)對(duì)象的迭代器。不同的 body 類型對(duì)應(yīng)不同的要求。
header 參數(shù)應(yīng)該是 HTTP 頭部的映射,是一個(gè)字典類型。
如果 header 中不包含 Content-Length 項(xiàng),那么會(huì)根據(jù) body 的不同來(lái)自動(dòng)添加上去。
2、HTTPConnection.getresponse()
必須在請(qǐng)求發(fā)送后才能調(diào)用得到服務(wù)器返回的內(nèi)容,返回的是一個(gè) HTTPResponse 實(shí)例。
3、HTTPConnection.set_debuglevel(level)
設(shè)置調(diào)試級(jí)別,默認(rèn)調(diào)試級(jí)別是 0 ,意味著沒(méi)有調(diào)試輸出。
4、HTTPConnection.set_tunnel(host, port=None, headers=None)
設(shè)置 HTTP 隧道鏈接的主機(jī)和端口,這允許連接使用代理服務(wù)器。
5、HTTPConnection.connect()
連接指定的服務(wù)器。默認(rèn)情況下,如果客戶端沒(méi)有連接,則會(huì)在 request 請(qǐng)求時(shí)自動(dòng)調(diào)用該方法。
6、HTTPConnection.close()
關(guān)閉鏈接。
7、HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)
當(dāng)和服務(wù)器的鏈接成功后,應(yīng)當(dāng)首先調(diào)用該方法。
發(fā)送到服務(wù)器的內(nèi)容包括:request 字符串、selector 字符串和 HTTP 協(xié)議版本。
8、HTTPConnection.putheader(header, argument[, …])
發(fā)送 HTTP 頭部到服務(wù)器。
發(fā)送到服務(wù)器的內(nèi)容包括:header 頭部、冒號(hào)、空格和參數(shù)列表里的第一個(gè)。
9、HTTPConnection.endheaders(message_body=None)
發(fā)送一個(gè)空白行到服務(wù)器,標(biāo)識(shí)頭部的結(jié)束。
10、HTTPConnection.send(data)
發(fā)送數(shù)據(jù)到服務(wù)器。
應(yīng)該在 endheaders() 方法之后和在 getresponse() 方法之前調(diào)用。
HTTPResponse 對(duì)象方法
HTTPResponse 實(shí)例包含了從服務(wù)器返回的 HTTP 回應(yīng)。
它提供了訪問(wèn)請(qǐng)求頭部和 body 部分的方法。
HTTPResponse 是一個(gè)可迭代的對(duì)象而且可以使用 with 語(yǔ)句來(lái)聲明。
HTTPResponse 實(shí)例有如下的方法 :
1、HTTPResponse.read([amt])
讀取和返回 response 的 body 部分。
2、HTTPResponse.readinto(b)
讀取指定的字節(jié)長(zhǎng)度 len(b),并返回到緩沖字節(jié) b 。
函數(shù)返回讀取的字節(jié)數(shù)
3、HTTPResponse.getheader(name,default=None)
返回指定名稱 name 的 HTTP 頭部值,如果沒(méi)有相應(yīng)匹配的 name 值,則返回默認(rèn)的 None。如果有多個(gè)相匹配的,則返回所有的值,以逗號(hào)分隔。
4、HTTPResponse.getheaders()
以元組的形式返回所有的頭部信息 (header,value)。
5、HTTPResponse.fileno()
6、HTTPResponse.msg
7、HTTPResponse.version。
HTTP 協(xié)議版本
8、HTTPResponse.status
HTTP 狀態(tài)碼
9、HTTPResponse.reason
10、HTTPResponse.debuglevel
11、HTTPResponse.closed
如果為 True ,說(shuō)明連接已關(guān)閉。
示例
import http.client import urllib,parser # # 初始化一個(gè) https 鏈接 conn = http.client.HTTPSConnection("www.python.org") # 指定 request 請(qǐng)求的方法和請(qǐng)求的鏈接地址 conn.request("GET","/doc/") # 得到返回的 http response r1 = conn.getresponse() # HTTP 狀態(tài)碼 print(r1.status,r1.reason) # HTTP 頭部 print(r1.getheaders()) # body 部分 print(r1.read()) # 如果連接沒(méi)有關(guān)閉,打印輸出前 200 個(gè)字節(jié) if not r1.closed: print(r1.read(200)) # 關(guān)閉連接后才能重新請(qǐng)求 conn.close() # 請(qǐng)求一個(gè)不存在的文件或地址 conn.request("GET","/parrot.spam") r2 = conn.getresponse() print(r2.status,r2.reason) conn.close() # 使用 HEAD 請(qǐng)求,但是不會(huì)返回任何數(shù)據(jù) conn = http.client.HTTPSConnection("www.python.org") conn.request("HEAD","/") res = conn.getresponse() print(res.status,res.reason) data = res.read() print(len(data)) conn.close() # 使用 POST 請(qǐng)求,提交的數(shù)據(jù)放在 body 部分 params = urllib.parse.urlencode({'@number':12524,'@type':'issue','@action':'show'}) # post 請(qǐng)求數(shù)據(jù),要帶上 Content-type 字段,以告知消息主體以何種方式編碼 headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"} conn = http.client.HTTPConnection("bugs.python.org") conn.request("POST","/",params,headers) response = conn.getresponse() # 訪問(wèn)被重定向 print(response.status,response.reason) print(response.read().decode("utf-8")) conn.close()
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
詳解python websocket獲取實(shí)時(shí)數(shù)據(jù)的幾種常見(jiàn)鏈接方式
這篇文章主要介紹了詳解python websocket獲取實(shí)時(shí)數(shù)據(jù)的幾種常見(jiàn)鏈接方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07淺談Python生成器generator之next和send的運(yùn)行流程(詳解)
下面小編就為大家?guī)?lái)一篇淺談Python生成器generator之next和send的運(yùn)行流程(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05卸載所有通過(guò)pip安裝的Python包的方法總結(jié)(Windows系統(tǒng))
這篇文章主要介紹了卸載所有通過(guò)pip安裝的Python包的方法總結(jié)(Windows系統(tǒng)),文中通過(guò)代碼示例和圖文講解的非常詳細(xì),并具有一定的參考價(jià)值,需要的朋友可以參考下2024-08-08在Python中操作MongoDB的詳細(xì)教程和案例分享
MongoDB是一個(gè)高性能、開(kāi)源、無(wú)模式的文檔型數(shù)據(jù)庫(kù),非常適合存儲(chǔ)JSON風(fēng)格的數(shù)據(jù),Python作為一種廣泛使用的編程語(yǔ)言,通過(guò)PyMongo庫(kù)可以方便地與MongoDB進(jìn)行交互,本文將詳細(xì)介紹如何在Python中使用PyMongo庫(kù)來(lái)操作MongoDB數(shù)據(jù)庫(kù),需要的朋友可以參考下2024-08-08Django項(xiàng)目創(chuàng)建的圖文教程
本文主要介紹了Django項(xiàng)目創(chuàng)建的圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python實(shí)現(xiàn)AES算法及AES-CFB8加解密源碼
這篇文章主要為大家介紹了python實(shí)現(xiàn)AES算法及AES-CFB8加解密的源碼示例,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02python免殺技術(shù)shellcode的加載與執(zhí)行
本文主要介紹了python免殺技術(shù)shellcode的加載與執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Biblibili視頻投稿接口分析并以Python實(shí)現(xiàn)自動(dòng)投稿功能
這篇文章主要介紹了Biblibili視頻投稿接口分析并以Python實(shí)現(xiàn)自動(dòng)投稿功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02詳解python中return和print的區(qū)別和用途
在 Python 中,return 和 print 是兩種常見(jiàn)的語(yǔ)句,用于在函數(shù)中輸出信息或返回值,盡管它們看起來(lái)相似,但它們有不同的作用和用法,本文將詳細(xì)介紹 return 和 print 在函數(shù)中的區(qū)別,并提供豐富的示例代碼,以幫助你更好地理解它們的用途2023-11-11