httplib
httplib — HTTP protocol client
注意
该httplib
模块已被重命名为http.client
Python 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。
源代码:
Lib / httplib.py
该模块定义了实现HTTP和HTTPS协议客户端的类。通常不会直接使用 - 该模块urllib
使用它来处理使用HTTP和HTTPS的URL。
注意
HTTPS支持仅在socket
模块使用SSL支持进行编译时才可用。
注意
这个模块的公共接口在Python 2.0中有很大改变。所述HTTP
类只是为了与1.5.2向后兼容性保留。它不应该用在新代码中。请参阅联机文档以了解使用情况。
该模块提供以下类别:
class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])
一个HTTPConnection
实例代表一个HTTP服务器的事务。它应该被实例化,传递一个主机和可选的端口号。如果没有传递端口号,则从主机字符串中提取端口(如果它具有表单)host:port
,否则使用默认的HTTP端口(80)。当为true时,如果状态行不能被解析为有效的HTTP / 1.0或1.1状态行,则会引发可选参数strict
(缺省为false值)BadStatusLine
。如果给出可选的timeout
参数,阻塞操作(如连接尝试)将在几秒后超时(如果未给出,则使用全局默认超时设置)。可选的source_address
参数可以是一个(主机,端口)的元组作为HTTP连接的源地址。
例如,以下调用都会创建在同一主机和端口连接到服务器的实例:
>>> h1 = httplib.HTTPConnection('www.cwi.nl')
>>> h2 = httplib.HTTPConnection('www.cwi.nl:80')
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80)
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
2.0版本中的新功能。
在版本2.6中更改:添加了超时
。
在版本2.7中更改:添加了source_address
。
class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])
它的一个子类HTTPConnection
使用SSL与安全服务器进行通信。默认端口是443
。如果指定了上下文
,则它必须是ssl.SSLContext
描述各种SSL选项的实例。
key_file
和cert_file
已弃用,请ssl.SSLContext.load_cert_chain()
改为使用,或者ssl.create_default_context()
为您选择系统的可信CA证书。
请阅读安全注意事项以了解有关最佳做法的更多信
2.0版本中的新功能。
在版本2.6中更改:添加了超时
。
在版本2.7中更改:添加了source_address
。
在版本2.7.9中更改:已添加上下文
。
此类现在默认执行所有必需的证书和主机名检查。为了恢复到之前未经验证的行为,ssl._create_unverified_context()
可以将其传递给上下文
参数。
class httplib.HTTPResponse(sock, debuglevel=0, strict=0)
成功连接后返回实例的类。没有直接由用户实例化。
2.0版本中的新功能。
class httplib.HTTPMessage
一个HTTPMessage
实例用于保存来自HTTP响应的头文件。它是使用mimetools.Message
该类实现的,并提供了用于处理HTTP头的实用功能。它不是由用户直接实例化的。
以下例外情况适当提出:
exception httplib.HTTPException
此模块中其他例外的基类。它是一个子类Exception
。
2.0版本中的新功能。
exception httplib.NotConnected
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.InvalidURL
HTTPException
如果给出端口并且是非数字或空的,则产生子类。
2.3版本的新功能。
exception httplib.UnknownProtocol
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.UnknownTransferEncoding
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.UnimplementedFileMode
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.IncompleteRead
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.ImproperConnectionState
一个子类HTTPException
。
2.0版本中的新功能。
exception httplib.CannotSendRequest
一个子类ImproperConnectionState
。
2.0版本中的新功能。
exception httplib.CannotSendHeader
一个子类ImproperConnectionState
。
2.0版本中的新功能。
exception httplib.ResponseNotReady
一个子类ImproperConnectionState
。
2.0版本中的新功能。
exception httplib.BadStatusLine
一个子类HTTPException
。如果服务器响应我们不了解的HTTP状态代码,就会引发此问题。
2.0版本中的新功能。
这个模块中定义的常量是:
httplib.HTTP_PORT
HTTP协议的默认端口(始终80
)。
httplib.HTTPS_PORT
HTTPS协议的默认端口(始终443
)。
以及整数状态码的以下常量:
Constant | Value | Definition |
---|---|---|
CONTINUE | 100 | HTTP/1.1, RFC 2616, Section 10.1.1 |
SWITCHING_PROTOCOLS | 101 | HTTP/1.1, RFC 2616, Section 10.1.2 |
PROCESSING | 102 | WEBDAV, RFC 2518, Section 10.1 |
OK | 200 | HTTP/1.1, RFC 2616, Section 10.2.1 |
CREATED | 201 | HTTP/1.1, RFC 2616, Section 10.2.2 |
ACCEPTED | 202 | HTTP/1.1, RFC 2616, Section 10.2.3 |
NON_AUTHORITATIVE_INFORMATION | 203 | HTTP/1.1, RFC 2616, Section 10.2.4 |
NO_CONTENT | 204 | HTTP/1.1, RFC 2616, Section 10.2.5 |
RESET_CONTENT | 205 | HTTP/1.1, RFC 2616, Section 10.2.6 |
PARTIAL_CONTENT | 206 | HTTP/1.1, RFC 2616, Section 10.2.7 |
MULTI_STATUS | 207 | WEBDAV RFC 2518, Section 10.2 |
IM_USED | 226 | Delta encoding in HTTP, RFC 3229, Section 10.4.1 |
MULTIPLE_CHOICES | 300 | HTTP/1.1, RFC 2616, Section 10.3.1 |
MOVED_PERMANENTLY | 301 | HTTP/1.1, RFC 2616, Section 10.3.2 |
FOUND | 302 | HTTP/1.1, RFC 2616, Section 10.3.3 |
SEE_OTHER | 303 | HTTP/1.1, RFC 2616, Section 10.3.4 |
NOT_MODIFIED | 304 | HTTP / 1.1,RFC 2616,第10.3.5节 |
使用代理服务器 | 305 | HTTP / 1.1,RFC 2616,第10.3.6节 |
TEMPORARY_REDIRECT | 307 | HTTP / 1.1,RFC 2616,第10.3.8节 |
错误的请求 | 400 | HTTP / 1.1,RFC 2616,第10.4.1节 |
未经授权 | 401 | HTTP / 1.1,RFC 2616,第10.4.2节 |
PAYMENT_REQUIRED | 402 | HTTP / 1.1,RFC 2616,第10.4.3节 |
FORBIDDEN | 403 | HTTP / 1.1,RFC 2616,第10.4.4节 |
未找到 | 404 | HTTP / 1.1,RFC 2616,第10.4.5节 |
METHOD_NOT_ALLOWED | 405 | HTTP / 1.1,RFC 2616,第10.4.6节 |
不能接受的 | 406 | HTTP / 1.1,RFC 2616,第10.4.7节 |
PROXY_AUTHENTICATION_REQUIRED | 407 | HTTP / 1.1,RFC 2616,第10.4.8节 |
请求超时 | 408 | HTTP / 1.1,RFC 2616,第10.4.9节 |
冲突 | 409 | HTTP / 1.1,RFC 2616,第10.4.10节 |
GONE | 410 | HTTP / 1.1,RFC 2616,第10.4.11节 |
LENGTH_REQUIRED | 411 | HTTP / 1.1,RFC 2616,第10.4.12节 |
PRECONDITION_FAILED | 412 | HTTP / 1.1,RFC 2616,第10.4.13节 |
请求的实体太大 | 413 | HTTP / 1.1,RFC 2616,第10.4.14节 |
REQUEST_URI_TOO_LONG | 414 | HTTP / 1.1,RFC 2616,第10.4.15节 |
UNSUPPORTED_MEDIA_TYPE | 415 | HTTP / 1.1,RFC 2616,第10.4.16节 |
REQUESTED_RANGE_NOT_SATISFIABLE | 416 | HTTP / 1.1,RFC 2616,第10.4.17节 |
EXPECTATION_FAILED | 417 | HTTP / 1.1,RFC 2616,第10.4.18节 |
UNPROCESSABLE_ENTITY | 422 | WEBDAV,RFC 2518,第10.3节 |
已锁定 | 423 | WEBDAV RFC 2518,第10.4节 |
FAILED_DEPENDENCY | 424 | WEBDAV,RFC 2518,第10.5节 |
UPGRADE_REQUIRED | 426 | HTTP升级到TLS,RFC 2817,第6部分 |
内部服务器错误 | 500 | HTTP / 1.1,RFC 2616,10.5.1节 |
未实现 | 501 | HTTP / 1.1,RFC 2616,第10.5.2节 |
错误的网关 | 502 | HTTP / 1.1 RFC 2616,10.5.3节 |
暂停服务 | 503 | HTTP / 1.1,RFC 2616,10.5.4节 |
GATEWAY_TIMEOUT | 504 | HTTP / 1.1 RFC 2616,10.5.5节 |
HTTP_VERSION_NOT_SUPPORTED | 505 | HTTP / 1.1,RFC 2616,第10.5.6节 |
存储空间不足 | 507 | WEBDAV,RFC 2518,第10.6节 |
NOT_EXTENDED | 510 | HTTP扩展框架,RFC 2774,第7部分 |
httplib.responses
该字典将HTTP 1.1状态代码映射到W3C名称。
例如:httplib.responses[httplib.NOT_FOUND]
是'Not Found'
。
2.5版本中的新功能。
1. HTTPConnection对象
HTTPConnection
实例具有以下方法:
HTTPConnection.request(method, url[, body[, headers]])
这将使用HTTP请求方法
方法
和选择器url
向服务器发送请求。如果body
参数存在,它应该是在完成标题后发送的一串数据。或者,它可能是一个打开的文件对象,在这种情况下文件的内容被发送; 这个文件对象应该支持fileno()
和read()
方法
。该头
参数应该是额外的HTTP标头
的映射与发送请求。
如果没有在标题中
提供标题
,Content-Length
则如果可以根据str
表示的长度或根据磁盘上文件的报告大小确定正文的长度,则会为所有方法自动添加标题
。如果体
是None
未设置标题
除外期望的主体
(方法PUT
,POST
和PATCH
),在该情况下,它被设定为0
。
在版本2.6中更改:body
可以是文件对象。
HTTPConnection.getresponse()
在发送请求以获取服务器的响应之后应该调用它。返回一个HTTPResponse
实例。
注意
请注意,您必须先阅读整个响应,然后才能向服务器发送新请求。
HTTPConnection.set_debuglevel(level)
设置调试级别(打印的调试输出量)。默认的调试级别是0
,意味着不打印调试输出。
HTTPConnection.set_tunnel(host, port=None, headers=None)
设置HTTP连接隧道的主机和端口。通常在需要通过代理服务器执行HTTPS连接时使用。
headers参数应该是通过CONNECT请求发送的额外HTTP头的映射。
2.7版本的新功能。
HTTPConnection.connect()
连接到创建对象时指定的服务器。
HTTPConnection.close()
关闭与服务器的连接。
作为使用上述request()
方法的替代方法,您还可以通过使用以下四个函数逐步发送您的请求。
HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])
这应该是连接到服务器之后的第一个调用。它向服务器发送一个包含请求
字符串,选择器
字符串和HTTP版本(HTTP/1.1
)的行。要禁用自动发送Host:
或Accept-Encoding:
标题(例如接受附加内容编码),请指定skip_host
或skip_accept_encoding
并使用非False值。
在版本2.4中进行了更改:添加了skip_accept_encoding
参数。
HTTPConnection.putheader(header, argument[, ...])
向服务器发送RFC 822
风格的标头。它发送一行到服务器,包括标题,冒号和空格以及第一个参数。如果给出更多参数,则会发送连续行,每行包含一个制表符和一个参数。
HTTPConnection.endheaders(message_body=None)
向服务器发送一个空行,表示标题的结尾。可选的message_body
参数可用于传递与请求关联的消息主体。如果消息正文是字符串,则消息正文将与消息标题在同一个数据包中发送,否则将以单独的数据包发送。
在版本2.7中更改:message_body
已添加。
HTTPConnection.send(data)
将数据发送到服务器。只有在endheaders()
方法被调用之后并且被调用之前,才应该直接使用getresponse()
它。
2. HTTPResponse对象
HTTPResponse
实例具有以下方法和属性:
HTTPResponse.read([amt])
读取并返回响应主体,或直到下一个AMT
字节。
HTTPResponse.getheader(name[, default])
获得标题的内容名称
,或默认
,如果没有匹配的头。
HTTPResponse.getheaders()
返回(标题,值)元组列表。
2.4版本中的新功能。
HTTPResponse.fileno()
返回fileno
底层套接字。
HTTPResponse.msg
mimetools.Message
包含响应标头实例。
HTTPResponse.version
服务器使用的HTTP协议版本。HTTP / 1.0为10,HTTP / 1.1为11。
HTTPResponse.status
服务器返回的状态码。
HTTPResponse.reason
服务器返回的原因短语。
3.例子
以下是使用该GET
方法的示例会话:
>>> import httplib
>>> conn = httplib.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
以下是使用该HEAD
方法的示例会话。请注意,该HEAD
方法从不返回任何数据。
>>> import httplib
>>> conn = httplib.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 == ''
True
以下是一个示例会话,显示如何POST
请求:
>>> import httplib, urllib
>>> params = 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
302 Found
>>> data = response.read()
>>> data
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()
客户端HTTP PUT
请求与POST
请求非常相似。区别仅在于HTTP服务器允许通过PUT
请求创建资源的服务器端。这里是一个示例会话,展示了如何PUT
使用httplib 完成请求:
>>> # 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 response.status, response.reason
200, OK