百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python3从零学习-5.10.8、http.client—HTTP 协议客户端

off999 2024-11-09 12:56 17 浏览 0 评论

源代码: Lib/http/client.py

这个模块定义了实现 HTTP 和 HTTPS 协议客户端的类。 它通常不直接使用 — 模块 urllib.request 用它来处理使用 HTTP 和 HTTPS 的 URL。

注解 : HTTPS 支持仅在编译 Python 时启用了 SSL 支持的情况下(通过 ssl 模块)可用。

该模块支持以下类:

class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None)

HTTPConnection实例表示一个使用HTTP服务器的事务。应该实例化它,向它传递主机和可选端口号。如果没有传递端口号,则从主机字符串中提取端口(如果它具有form host:port),否则使用缺省HTTP端口(80)。如果给定了可选的超时参数,那么阻塞操作(如连接尝试)将在那么多秒后超时(如果没有给定,则使用全局默认超时设置)。可选的source_address参数可以是用作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)

在 3.2 版更改: 添加了*source_address* 参数

在 3.4 版更改: 删除了 strict 参数,不再支持 HTTP 0.9 风格的“简单响应”。

class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None)

HTTPConnection 的子类,使用 SSL 与安全服务器进行通信。 默认端口为 443。 如果指定了 context,它必须为一个描述 SSL 各选项的 ssl.SSLContext 实例。


在 3.2 版更改: 添加了 source_address, context 和 check_hostname。

在 3.2 版更改: 这个类目前会在可能的情况下(即如果 ssl.HAS_SNI 为真值)支持 HTTPS 虚拟主机。

在 3.4 版更改: 删除了 strict 参数,不再支持 HTTP 0.9 风格的“简单响应”。

在 3.4.3 版更改: 目前这个类在默认情况下会执行所有必要的证书和主机检查。 要回复到先前的非验证行为,可以将 ssl._create_unverified_context() 传递给 context 参数。

3.6 版后已移除: key_file 和 cert_file 已弃用并转而推荐 context。 请改用 ssl.SSLContext.load_cert_chain() 或让 ssl.create_default_context() 为你选择系统所信任的 CA 证书。

check_hostname 参数也已弃用;应当改用 context 的 ssl.SSLContext.check_hostname 属性。


class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)

在成功连接后返回类的实例,而不是由用户直接实例化。

在 3.4 版更改: 删除了 strict 参数,不再支持HTTP 0.9 风格的“简单响应”。

下列异常可以适当地被引发:


  • exception http.client.HTTPException

此模块中其他异常的基类。 它是 Exception 的一个子类。


  • exception http.client.NotConnected

HTTPException 的一个子类。


  • exception http.client.InvalidURL

HTTPException 的一个子类,如果给出了一个非数字或为空值的端口就会被引发。


  • exception http.client.UnknownProtocol

HTTPException 的一个子类。


  • exception http.client.UnknownTransferEncoding

HTTPException 的一个子类。


  • exception http.client.UnimplementedFileMode

HTTPException 的一个子类。


  • exception http.client.IncompleteRead

HTTPException 的一个子类。


  • exception http.client.ImproperConnectionState

HTTPException 的一个子类。


  • exception http.client.CannotSendRequest

ImproperConnectionState 的一个子类。


  • exception http.client.CannotSendHeader

ImproperConnectionState 的一个子类。


  • exception http.client.ResponseNotReady

ImproperConnectionState 的一个子类。


  • exception http.client.BadStatusLine

HTTPException 的一个子类。 如果服务器反馈了一个我们不理解的 HTTP 状态码就会被引发。


  • exception http.client.LineTooLong

HTTPException 的一个子类。 如果在 HTTP 协议中从服务器接收到过长的行就会被引发。


  • exception http.client.RemoteDisconnected

ConnectionResetError 和 BadStatusLine 的一个子类。 当尝试读取响应时的结果是未从连接读取到数据时由 HTTPConnection.getresponse() 引发,表明远端已关闭连接。

此模块中定义的常量为:

  • http.client.HTTP_PORT

HTTP 协议默认的端口号 (总是 80)。


  • http.client.HTTPS_PORT

HTTPS 协议默认的端口号 (总是 443)。


  • http.client.responses

这个字典把 HTTP 1.1 状态码映射到 W3C 名称。

例如:http.client.responses[http.client.NOT_FOUND] 是 'NOT FOUND (未发现)。


HTTPConnection 对象


HTTPConnection 实例拥有以下方法:

HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False)

这会使用 HTTP 请求方法 method 和选择器 url 向服务器发送请求。


如果给定 body,那么给定的数据会在信息头完成之后发送。它可能是一个 str 、一个 bytes-like object 、一个打开的 file object,或者 bytes 迭代器。如果 body 是字符串,它会按 HTTP 默认的 ISO-8859-1 编码;如果是一个字节类对象,它会按原样发送;如果是 file object ,文件的内容会被发送,这个文件对象应该支持 read() 方法。如果这个文件对象是一个 io.TextIOBase 实例, read() 方法返回的数据会按 ISO-8859-1 编码,否则 read() 方法返回的数据会按原样发送;如果 body 是一个迭代器,迭代器中的元素会被发送,直到迭代器耗尽。


headers 参数应是额外的随请求发送的 HTTP 信息头的字典。


如果 headers 既不包含 Content-Length 也没有 Transfer-Encoding,但存在请求正文,那么这些头字段中的一个会自动设定。如果 body 是 None,那么对于要求正文的方法 (PUT,POST,和 PATCH),Content-Length 头会被设为 0。如果 body 是字符串或者类似字节的对象,并且也不是 文件,Content-Length 头会设为正文的长度。任何其他类型的 body (一般是文件或迭代器)会按块编码,这时会自动设定 Transfer-Encoding 头以代替 Content-Length。


在 headers 中指定 Transfer-Encoding 时, encode_chunked 是唯一相关的参数。如果 encode_chunked 为 False,HTTPConnection 对象会假定所有的编码都由调用代码处理。如果为 True,正文会按块编码。


注解 HTTP 协议在 1.1 版中添加了块传输编码。除非明确知道 HTTP 服务器可以处理 HTTP 1.1,调用者要么必须指定 Content-Length,要么必须传入 str 或字节类对象,注意该对象不能是表达 body 的文件。

3.2 新版功能: body 现在可以是可迭代对象了。


在 3.6 版更改: 如果 Content-Length 和 Transfer-Encoding 都没有在 headers 中设置,文件和可迭代的 body 对象现在会按块编码。添加了 encode_chunked 参数。不会尝试去确定文件对象的 Content-Length。


HTTPConnection.getresponse()

应当在发送一个请求从服务器获取响应时被调用。 返回一个 HTTPResponse 的实例。


注解 请注意你必须在读取了整个响应之后才能向服务器发送新的请求。

在 3.5 版更改: 如果引发了 ConnectionError 或其子类, HTTPConnection 对象将在发送新的请求时准备好重新连接。


HTTPConnection.set_debuglevel(level)

设置调试等级。 默认的调试等级为 0,意味着不会打印调试输出。 任何大于 0 的值将使得所有当前定义的调试输出被打印到 stdout。 debuglevel 会被传给任何新创建的 HTTPResponse 对象。


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

为 HTTP 连接隧道设置主机和端口。 这将允许通过代理服务器运行连接。


host 和 port 参数指明隧道连接的位置(即 CONNECT 请求所包含的地址,而 不是 代理服务器的地址)。


headers 参数应为一个随 CONNECT 请求发送的额外 HTTP 标头的映射。


例如,要通过一个运行于本机 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()

关闭到服务器的连接。


作为对使用上述 request() 方法的替代同,你也可以通过使用下面的四个函数,分步骤发送请的请求。


HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False)

这应该是连接到服务器后的第一次调用。它向服务器发送一行代码,包括方法字符串、url字符串和HTTP版本(HTTP/1.1)。要禁用Host:或accept - encoding:头的自动发送(例如接受额外的内容编码),请使用非假值指定skip_host或skip_accept_encoding。


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

发送一个RFC 822样式的头到服务器。它向服务器发送一行代码,包括标题、冒号、空格和第一个参数。如果给出更多的参数,则发送延续行,每一行由一个制表符和一个参数组成。


HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)

向服务器发送一个空行,表示标头的结束。可选的message_body参数可用于传递与请求关联的消息体。


如果encode_chunked为真,则message_body的每次迭代的结果将按照RFC 7230第3.3.1节的规定进行块编码。数据的编码方式取决于message_body的类型。如果message_body实现了缓冲区接口,那么编码将产生单个块。如果message_body是一个集合。可迭代的,message_body的每次迭代都会产生一个块。如果message_body是一个文件对象,那么每次对.read()的调用都会产生一个块。该方法会立即在message_body之后自动发出块编码数据的结束信号。


HTTPConnection.send(data)

发送数据到服务器。这应该只在调用endheaders()方法之后和getresponse()调用之前直接使用。

HTTPResponse 对象

HTTPResponse实例包装来自服务器的HTTP响应。它提供对请求头和实体主体的访问。响应是一个可迭代对象,可以在with语句中使用。

在3.5版更改:io。BufferedIOBase接口现在已经实现,并且支持它的所有读取器操作。


HTTPResponse.read([amt])

读取并返回响应体,或者一直到下一个amt字节。


HTTPResponse.readinto(b)

将响应体的下一个len(b)字节读入缓冲区b。返回读取的字节数。


HTTPResponse.getheader(name, default=None)

返回标题名称的值,如果没有标题匹配名称,则返回默认值。如果名称名为name的头部超过一个,则返回由','连接的所有值。如果‘default’是除单个字符串之外的任何可迭代的字符串,其元素也会以逗号连接返回。


HTTPResponse.getheaders()

返回元组(头、值)列表。


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

调试钩子。如果debuglevel大于0,则在读取和解析响应时,消息将被打印到stdout。


HTTPResponse.closed

如果流关闭,则为真。

例子

下面是一个使用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 not r1.closed:
...     print(r1.read(200))  # 200 bytes
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()

下面是一个使用HEAD方法的示例会话。注意,HEAD方法从不返回任何数据。

>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b''
True

下面是一个示例会话,展示了如何post请求:

>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> 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()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()

客户端HTTP PUT请求与POST请求非常相似。区别仅在于服务器端,其中HTTP服务器将允许通过PUT请求创建资源。需要注意的是,定制HTTP方法+也在urllib.request中被处理。通过发送适当的+方法属性来请求。下面是一个示例会话,展示了如何使用http.client执行PUT请求:

>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK

相关推荐

u盘检测软件下载(u盘测试软件)

1、u盘芯片检测工具(ChipEasy)可以查看USB设备PID、VID、SN、制造商、产品名等;2、查看USB设备主控芯片信息、闪存芯片信息、固件信息、电流控制3、SSD型号...

电脑现在什么系统最好(电脑现在用什么系统好)

WINXP好用,但过时了。VISTA不好用,没推开就夭折了。WIN8/8.1是针对触模屏设计的,如果你用的不是触摸屏平板电脑是普通电脑,使WIN8/8.1总觉着很蹩扭。新出的WIN10,功能...

账号怎么注册(steam账号怎么注册)

如果注册是qq账号【qq号码的申请办法】【1】双击qq登陆界面,在qq帐号填写空格的后面你可以看见:[申请帐号];【2】点击[申请帐号]进入,就可以在网上免费申请号码了;【3】进入www.qq.com...

tmp文件是什么意思(tmp文件有什么用)

在系统C:\Windows\Temp文件夹中,我们经常会发现一些后缀名为TMP的文件,在该文件夹中的这些文件其实都是临时文件。它们可能是系统被误关机,或者其他程序没有删除而生的。而且在该文件夹中还有其...

怎么给u盘格式化(怎么给u盘格式化成FAT32)

u盘插入电脑,等待桌面弹出u盘图标。打开“计算机”。左键选中u盘,单击右键,在弹出的菜单中,点击“格式化”。点击“开始”,点击“确定”即可。格式化u盘详细步骤1、找到U盘盘符,鼠标右键点击,弹出菜单中...

harmonyos主题下载(harmonyos主题怎么换)

首先,打开荣耀手机的应用市场,在搜索框中输入“华为鸿蒙主题”,然后点击搜索。找到“华为鸿蒙主题”应用后,点击下载即可。下载完成后,打开“华为鸿蒙主题”应用,选择心仪的主题,点击下载并应用即可享受华为鸿...

戴尔笔记本电脑黑屏却开着机

对于电脑黑屏的处理基本上采用排除、替换相结合的方法,其原则应本着先替换排除可疑性最大的部件。对于普通电脑用户来讲,专业知识不足,可以按下列步骤分析故障原因,以便可以自己动手排除故障。首先检查接触是否良...

手机版电脑桌面下载(手机电脑桌面下载软件安装包)

只有电脑版手机助手软件,没有手机桌面这个软件在电脑上点击今日头条APP下载安装即可哦你好,陌陌电脑版如果说你想要下载到电脑桌面的话,你只需要长按把它添加到你的电脑桌面就可以了。要将软件下载到桌面并创建...

ghost备份中文图解(ghost备份1837)

其实是这样的ghost文件备份后会生成两个文件一个是.GHO一个是.GHS文件FAT32格式的分区,单个文件最大只支持到2G(2048M),如果你的镜像>2G,这时的做的GHOST在一个文件里装...

win10一键重装win7(win10一键重装系统)

1、首先准备一个4GB以上可以正常使用的U盘。2、在一个可以正常使用的电脑上,下载老毛桃软件并安装。3、去网上下载所需的win7,win10选择自己所需要的系统,并下载下来。4、插入u盘并打开老毛桃...

戴尔按f12还原系统步骤win10

基本上正常的话是f8,如果你希望他变成年,F12,你要打开设置去连,然后把这个快捷键的位置调一调戴尔的键盘f1到f12恢复原功能的方法:1、可能是操作者操作有误的原因,使键盘没有任何反应。2、根据复合...

qq网页版官网(qq1网页版)
qq网页版官网(qq1网页版)

https://aq.qq.com/cn2/indexQQ安全中心是腾讯公司推出的QQ帐号保护软件,为广大QQ用户提供一站式的QQ安全服务,包括了密保管理、帐号保护、安全体检、修改密码、帐号申诉等功能,让账号更加安全可靠。为了全面保护QQ帐...

2025-11-18 15:03 off999

联想软件商店官网(联想应用商店官网下载安装)

要设置联想电脑应用商店,首先需要打开商店应用并进行登录。之后可以根据个人需求浏览并下载商店中的应用,也可以通过搜索功能查找特定应用。在商店中还可以管理已下载的应用、更新应用以及查看应用评价和评论。此外...

xp如何看电脑是32位还是64位
  • xp如何看电脑是32位还是64位
  • xp如何看电脑是32位还是64位
  • xp如何看电脑是32位还是64位
  • xp如何看电脑是32位还是64位
tp路由器设置登录网址(tplink路由器设置网址登录)

tplogin.cn是TPlink路由器界面的默认登陆入口地址。TPlink常见的登陆入口地址:192.168.1.1,192.168.0.1,tplogin.cn,192.168.0.254,192...

取消回复欢迎 发表评论: