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