http header 设置编码_【译】http.client
本模塊實(shí)現(xiàn)了HTTP和HTTPS協(xié)議的客戶端功能。通常本模塊不會被直接使用,而是被urllib.request調(diào)用,來處理HTTP和HTTPS相關(guān)的URL。
備注:HTTPS只有在支持SSL(帶有ssl模塊)的Python編譯器里面才是可用的。
(一)
模塊提供的類
class?http.client.HTTPConnection(host,?port=None,?[timeout,?]source_address=None,?blocksize=8192)
一個HTTPConnection實(shí)例表示和HTTP服務(wù)器的一次交互。實(shí)例化時,需要一個host和一個可選的port作為入?yún)ⅰT跊]有提供入?yún)ort的情況下,首先嘗試判斷host是不是符合host:port的格式:如果是,就從入?yún)ost中解析port;如果不是,此時會使用默認(rèn)的80端口。如果可選的入?yún)imeout有值,像建立連接之類的操作會在阻塞若干秒之后超時退出(如果沒有顯式的傳遞timeout,此時會使用系統(tǒng)默認(rèn)的超時配置)。可選入?yún)ource_address可以是(host,port)形式的tuple,用來指定建立HTTP連接的時候使用的源地址。可選入?yún)locksize,用來指定發(fā)送消息體的緩沖區(qū)大小。
舉個例子,下面的幾個實(shí)例都是指向同一個服務(wù)器的同一個端口。
>>> 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)class?http.client.HTTPSConnection(host,?port=None,?key_file=None,?cert_file=None,?[timeout,?]source_address=None,?*,?context=None,?check_hostname=None,?blocksize=8192)
HTTPConnection的子類,使用SSL和安全服務(wù)器通信。缺省的port是443。如果指定入?yún)ontext,它必須是能夠描述不同SSL選項(xiàng)的ssl.SSLContext實(shí)例。
class?http.client.HTTPResponse(sock,?debuglevel=0,?method=None,?url=None)
該類會連接有響應(yīng)的時候自動實(shí)例化,不需要用戶直接實(shí)例化。
(二)
模塊提供的函數(shù)
http.client.parse_headers(fp)
用來解析文件描述符中的請求頭或者響應(yīng)頭信息。描述符指向的文件必須是可讀的BufferedIOBase(而不是文本文件),而且必須滿足RFC 2822規(guī)定的頭部樣式。
本函數(shù)返回一個?http.client.HTTPMessage?實(shí)例,里面包含頭部信息,但是沒有請求體或者響應(yīng)體(和HTTPResponse.msg以及http.server.BaseHTTPRequestHandler.headers類似)。當(dāng)函數(shù)返回之后,文件描述符還可以繼續(xù)讀取HTTP消息實(shí)體。
備注:parse_headers()并不能夠解析HTTP消息里面的請求行或者響應(yīng)行,它只能夠解析name:value形式的頭部信息。在調(diào)用之前,需要確保文件描述符的首行消息已經(jīng)被讀取完畢。
(三)
HTTPConnection Objects
HTTPConnection.request(method,?url,?body=None,?headers={},?*,?encode_chunked=False)
調(diào)用本方法將會使用入?yún)⒅付ǖ膍ethod和url,發(fā)送一條HTTP請求到服務(wù)器。
如果指定入?yún)ody,body的數(shù)據(jù)會在發(fā)送完請求頭之后發(fā)送。它可以是str類型、類bytes的對象、一個打開的文件對象,或者一個可迭代的bytes。如果body為字符串,它會被ISO-8859-1規(guī)范(HTTP默認(rèn)規(guī)范)編碼。如果body是類bytes對象,它會被直接發(fā)送。如果body是一個文件對象,要求該文件對象可讀,如果文件對象是一個io.TextIOBase實(shí)例,調(diào)用read()返回的數(shù)據(jù)會通過ISO-8859-1規(guī)范編碼之后再發(fā)送,其他情況下會文件數(shù)據(jù)被直接發(fā)送。如果body是一個可迭代對象,里面的所有數(shù)據(jù)都會被發(fā)送出去。
入?yún)eaders要求是一個映射對象,里面有想要發(fā)送給服務(wù)器的請求頭信息。
在發(fā)送請求體的時候,如果headers里面沒有Content-Length 也沒有 Transfer-Encoding,它倆的其中之一會被自動添加。在要求有請求體的請求方法(PUT、POST、PATCH)中,如果請求體為空,Content-Length會被設(shè)為0。如果body是一個字符串或者類bytes對象,Content-Length會被設(shè)置為body的長度;其他情況下(body為文件對象或者可迭代對象),請求會被分塊,自動設(shè)置實(shí)際的Transfer-Encoding,而不會使用Content-Length。
入?yún)ncode_chunked只有在headers里面包含Transfer-Encoding時才會被用到。如果encode_chunked為False,HTTPConnection對象會認(rèn)為本次調(diào)用包含了全部的數(shù)據(jù)。如果encode_chunked為True,請求體會被分塊。
備注:分塊傳輸是HTTP/1.1添加的特性。如果服務(wù)器不支持HTTP/1.1,調(diào)用方要么指定Content-Length,要么需要將body指定為str類型或者類bytes對象。
HTTPConnection.getresponse()
本方法需要在發(fā)送完請求之后調(diào)用,來獲取響應(yīng)信息。其返回值為HTTPResponse實(shí)例。
備注:你需要在發(fā)送下一個請求之前,確保已經(jīng)讀取完畢所有的響應(yīng)信息。
HTTPConnection.set_debuglevel(level)
本方法用來設(shè)置調(diào)試級別。默認(rèn)的調(diào)試級別為0,即所有的調(diào)試輸出都不會被打印。任何大于0的值,都會觸發(fā)響應(yīng)的調(diào)試級別,將調(diào)試信息打印到標(biāo)準(zhǔn)輸出。調(diào)試級別會被隨后創(chuàng)建的HTTPResponse實(shí)例繼承。
HTTPConnection.set_tunnel(host, port=None, headers=None)
在使用HTTP連接隧道時,指定host和port。這樣是為了能夠使用代理連接。
host和port指定了連接的端點(diǎn)信息(即請求的服務(wù)器地址,而不是代理的地址)
舉個例子,為了使用在本地8080端口運(yùn)行的HTTPS代理服務(wù),可以將代理地址傳遞給HTTPSConnection,然后調(diào)用set_tunnel()來指定真實(shí)的服務(wù)器地址。
>>> import http.client>>> conn = http.client.HTTPSConnection("localhost", 8080)>>> conn.set_tunnel("www.python.org")>>> conn.request("HEAD","/index.html")HTTPConnection.connect()
用來建立和服務(wù)器的連接。默認(rèn)情況下,如果客戶端沒有建立連接,該方法會在請求的時會被自動被調(diào)用。
HTTPConnection.close()
關(guān)閉同服務(wù)器的連接。
HTTPConnection.blocksize
發(fā)送類文件消息時的緩沖區(qū)大小。
除了可以調(diào)用上面提到的request()方法,你也可以使用下面的四個方法,一步步的發(fā)送你的請求。
HTTPConnection.putrequest(method,?url,?skip_host=False,?skip_accept_encoding=False)
同服務(wù)器建立連接后,本方法應(yīng)該第一個被調(diào)用。它會發(fā)送一個包含method、url以及HTTP版本(HTTP/1.1)的請求行。如果想要禁用自動發(fā)送的Host和Accpet-Encoding請求頭,可以為skip_host和skip_accept_encoding指定一個不是False的值。
HTTPConnection.putheader(header, argument[,...])
本方法用來向服務(wù)器發(fā)送請求體,要求請求體符合RFC 822規(guī)范。它會發(fā)送一行包含header、一個冒號、一個空格以及第一個argument的請求頭信息。如果argument有多個入?yún)?#xff0c;請求消息的下一行會包含一個制表符和一個argument。
HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)
向服務(wù)器發(fā)送一個空行,標(biāo)識請求頭的結(jié)束。可選的入?yún)essage_body用來向請求消息中添加請求體。
如果encode_chunked為True,每個消息體會被按照RFC 7230規(guī)范(?3.3.1章節(jié))分塊。如何編碼請求數(shù)據(jù)會根據(jù)message_body的類型來確定。如果message_body實(shí)現(xiàn)了python的buffer接口規(guī)范,編碼后的消息會是一個單獨(dú)的塊。如果message_body是一個文件對象,每次調(diào)用read()讀取的數(shù)據(jù)都是一個塊。本方法會在message_body結(jié)束的時候自動在分塊消息中添加結(jié)束信息。
備注:因?yàn)榉謮K編碼的特殊性,空塊會被忽略。這是為了避免服務(wù)器因?yàn)榛蔚木幋a提前結(jié)束對請求數(shù)據(jù)的接收。
HTTPConnection.send(data)
發(fā)送數(shù)據(jù)給服務(wù)器。注意要在endheaders()方法被調(diào)用之后,getresponse()方法被調(diào)用之前調(diào)用本方法。
(四)
HTTPResponse Objects
一個HTTPResponse實(shí)例帶有服務(wù)器的響應(yīng)信息。也可以用它來查看請求頭和請求體的數(shù)據(jù)。響應(yīng)對象是一個可迭代對象。
HTTPResponse.read([amt])
讀取并返回響應(yīng)體數(shù)據(jù),也可以跳轉(zhuǎn)至指定的amt字節(jié)處。
HTTPResponse.readinto(b)
讀取len(b)字節(jié)的數(shù)據(jù)并將其寫入b。返回讀取的字節(jié)長度。
HTTPResponse.getheader(name,?default=None)
返回指定name的響應(yīng)頭內(nèi)容,如果沒有該響應(yīng)體返回default值。如果響應(yīng)頭中有多個name頭,其返回值以“,”連接。如果default不是單個字符串,而是可迭代對象,其返回值也會通過逗號連接。
HTTPResponse.getheaders()
返回一個列表,里面包含了(header,value)形式的tuple。
HTTPResponse.fileno()
返回套接字的描述符編號
HTTPResponse.msg
http.client.HTTPMessage的實(shí)例,里面包含了響應(yīng)體。http.client.HTTPMessage是email.message.Message的子類。
HTTPResponse.version
服務(wù)器使用HTTP協(xié)議版本。10代表HTTP/1.0,11代表HTTP/1.1
HTTPResponse.status
服務(wù)器返回的狀態(tài)碼
HTTPResponse.reason
服務(wù)器返回的狀態(tài)信息
HTTPResponse.debuglevel
一個調(diào)試鉤子。如果調(diào)試級別高于0,讀取和解析響應(yīng)數(shù)據(jù)時的調(diào)試消息會被打印在標(biāo)準(zhǔn)輸出。
HTTPResponse.closed
如果連接關(guān)閉返回True。
(五)
演示示例
下面是一個GET請求的演示:
>>> import http.client>>> conn = http.client.HTTPSConnection("www.python.org")>>> conn.request("GET", "/")>>> r1 = conn.getresponse()>>> print(r1.status, r1.reason)200 OK>>> data1 = r1.read() # This will return entire content.>>> # The following example demonstrates reading data in chunks.>>> conn.request("GET", "/")>>> r1 = conn.getresponse()>>> while chunk := r1.read(200):... print(repr(chunk))b'\n總結(jié)
以上是生活随笔為你收集整理的http header 设置编码_【译】http.client的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux+虚拟机上的wdcp,linu
- 下一篇: (BFS+hash去重)八数码问题