Source code: Lib/httplib.py
该模块定义了实现HTTP和HTTPS协议的客户端的类。通常不直接使用它 - 模块urllib使用它来处理使用HTTP和HTTPS的URL。
Note
仅当使用SSL支持编译套接字模块时,才能使用HTTPS支持。
Note
该模块的公共接口在Python 2.0中发生了重大变化。HTTP类仅保留与1.5.2的向后兼容性。它不应该在新的代码中使用。有关使用方法,请参阅在线文档。
该模块提供以下类:
一个HTTPConnection实例表示与HTTP服务器的一个事务。它应该被实例化传递一个主机和可选的端口号。如果没有端口号,如果主机字符串的形式为host:port,那么该端口将被提取,否则使用默认的HTTP端口(80)。当为True时,可选参数strict(默认为false值)会导致BadStatusLine被引发,如果状态行不能被解析为有效的HTTP / 1.0或1.1状态线。如果给定了可选的超时参数,则阻塞操作(如连接尝试)会在多秒之后超时(如果没有给出,则使用全局默认超时设置)。可选的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)
New in version 2.0.
在版本2.6中更改: timeout已添加。
在版本2.7中更改: source_address已添加。
使用SSL与安全服务器进行通信的HTTPConnection的子类。默认端口为443。 key_file是包含您的私钥的PEM格式文件的名称。cert_file是一个PEM格式的证书链文件。
Warning
这不会对服务器的证书进行任何验证。
New in version 2.0.
在版本2.6中更改: timeout已添加。
在版本2.7中更改: source_address已添加。
成功连接后返回实例的类。不由用户直接实例化。
New in version 2.0.
一个HTTPMessage实例用于保存HTTP响应中的头。它使用mimetools.Message类实现,并提供实用功能来处理HTTP头。它不是用户直接实例化的。
以下例外情况适当提出:
HTTPException的子类。
New in version 2.0.
HTTPException的子类,如果给出端口,则为非数字或空值。
New in version 2.3.
HTTPException的子类。
New in version 2.0.
HTTPException的子类。
New in version 2.0.
HTTPException的子类。
New in version 2.0.
HTTPException的子类。
New in version 2.0.
A subclass of HTTPException.
New in version 2.0.
A subclass of ImproperConnectionState.
New in version 2.0.
A subclass of ImproperConnectionState.
New in version 2.0.
A subclass of ImproperConnectionState.
New in version 2.0.
A subclass of HTTPException. 如果服务器使用我们不了解的HTTP状态代码进行响应,则引发。
New in version 2.0.
本模块中定义的常数为:
HTTP协议的默认端口(始终为80)。
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, Section 10.3.5 |
USE_PROXY | 305 | HTTP/1.1, RFC 2616, Section 10.3.6 |
TEMPORARY_REDIRECT | 307 | HTTP/1.1, RFC 2616, Section 10.3.8 |
BAD_REQUEST | 400 | HTTP/1.1, RFC 2616, Section 10.4.1 |
UNAUTHORIZED | 401 | HTTP/1.1, RFC 2616, Section 10.4.2 |
PAYMENT_REQUIRED | 402 | HTTP/1.1, RFC 2616, Section 10.4.3 |
FORBIDDEN | 403 | HTTP/1.1, RFC 2616, Section 10.4.4 |
NOT_FOUND | 404 | HTTP/1.1, RFC 2616, Section 10.4.5 |
METHOD_NOT_ALLOWED | 405 | HTTP/1.1, RFC 2616, Section 10.4.6 |
NOT_ACCEPTABLE | 406 | HTTP/1.1, RFC 2616, Section 10.4.7 |
PROXY_AUTHENTICATION_REQUIRED | 407 | HTTP/1.1, RFC 2616, Section 10.4.8 |
REQUEST_TIMEOUT | 408 | HTTP/1.1, RFC 2616, Section 10.4.9 |
CONFLICT | 409 | HTTP/1.1, RFC 2616, Section 10.4.10 |
GONE | 410 | HTTP/1.1, RFC 2616, Section 10.4.11 |
LENGTH_REQUIRED | 411 | HTTP/1.1, RFC 2616, Section 10.4.12 |
PRECONDITION_FAILED | 412 | HTTP/1.1, RFC 2616, Section 10.4.13 |
REQUEST_ENTITY_TOO_LARGE | 413 | HTTP/1.1, RFC 2616, Section 10.4.14 |
REQUEST_URI_TOO_LONG | 414 | HTTP/1.1, RFC 2616, Section 10.4.15 |
UNSUPPORTED_MEDIA_TYPE | 415 | HTTP/1.1, RFC 2616, Section 10.4.16 |
REQUESTED_RANGE_NOT_SATISFIABLE | 416 | HTTP/1.1, RFC 2616, Section 10.4.17 |
EXPECTATION_FAILED | 417 | HTTP/1.1, RFC 2616, Section 10.4.18 |
UNPROCESSABLE_ENTITY | 422 | WEBDAV, RFC 2518, Section 10.3 |
LOCKED | 423 | WEBDAV RFC 2518, Section 10.4 |
FAILED_DEPENDENCY | 424 | WEBDAV, RFC 2518, Section 10.5 |
UPGRADE_REQUIRED | 426 | HTTP Upgrade to TLS, RFC 2817, Section 6 |
INTERNAL_SERVER_ERROR | 500 | HTTP/1.1, RFC 2616, Section 10.5.1 |
NOT_IMPLEMENTED | 501 | HTTP/1.1, RFC 2616, Section 10.5.2 |
BAD_GATEWAY | 502 | HTTP/1.1 RFC 2616, Section 10.5.3 |
SERVICE_UNAVAILABLE | 503 | HTTP/1.1, RFC 2616, Section 10.5.4 |
GATEWAY_TIMEOUT | 504 | HTTP/1.1 RFC 2616, Section 10.5.5 |
HTTP_VERSION_NOT_SUPPORTED | 505 | HTTP/1.1, RFC 2616, Section 10.5.6 |
INSUFFICIENT_STORAGE | 507 | WEBDAV, RFC 2518, Section 10.6 |
NOT_EXTENDED | 510 | An HTTP Extension Framework, RFC 2774, Section 7 |
This dictionary maps the HTTP 1.1 status codes to the W3C names.
Example: httplib.responses[httplib.NOT_FOUND] is 'Not Found'.
New in version 2.5.
HTTPConnection instances have the following methods:
这将使用HTTP请求方法方法和选择器url向服务器发送请求。如果body参数存在,则它应该是头文件完成后要发送的一串数据。或者,它可以是打开的文件对象,在这种情况下文件的内容被发送;这个文件对象应该支持fileno()和read()方法。标题Content-Length自动设置为正确的值。头参数应该是要发送的额外HTTP头的映射。
在版本2.6中更改: body可以是一个文件对象。
from the serverReturns an HTTPResponse instance.
Note
请注意,您必须先阅读整个响应,然后才能向服务器发送新的请求。
设置调试级别(打印调试输出量)。默认调试级别为0,表示没有打印调试输出。
设置HTTP连接隧道的主机和端口。通常需要通过代理服务器进行HTTPS连接时使用。
头参数应该是使用CONNECT请求发送的额外HTTP头的映射。
New in version 2.7.
连接到创建对象时指定的服务器。
关闭与服务器的连接。
作为使用上述request()方法的替代方法,您还可以通过使用以下四个功能逐步发送请求。
这应该是连接到服务器之后的第一个调用。它向由请求字符串,选择器字符串和HTTP版本(HTTP / 1.1)组成的服务器发送一行。要禁用Host:或Accept-Encoding:标头的自动发送(例如,接受其他内容编码),请指定skip_host或skip_accept_encoding带有非False值。
Changed in version 2.4: skip_accept_encoding argument added.
向服务器发送一个 RFC 822标题。它将一行发送到由头,冒号和空格组成的服务器和第一个参数。如果给出更多的参数,则会发送连续行,每行包含一个选项卡和一个参数。
发送一条空行到服务器,标示头的结尾。可选的message_body参数可用于传递与请求相关联的邮件正文。如果消息主体是字符串,消息体将与消息标头相同的数据包发送,否则将以单独的数据包发送。
Changed in version 2.7: message_body was added.
将数据发送到服务器。只有在调用了endheaders()方法之后,才调用getresponse()之前,才能直接使用。
HTTPResponse实例具有以下方法和属性:
读取并返回响应正文,或直到下一个amt字节。
如果没有匹配的标题,获取标题名称或默认的内容。
返回(header,value)元组的列表。
New in version 2.4.
返回底层套接字的fileno。
包含响应头的mimetools.Message实例。
服务器使用的HTTP协议版本。10 for HTTP/1.0, 11 for HTTP/1.1.
服务器返回的状态码。
服务器返回的原因短语。
以下是使用GET方法的示例会话:
>>> import httplib
>>> conn = httplib.HTTPConnection("www.python.org")
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
这是使用HEAD方法的示例会话。请注意,HEAD方法从不返回任何数据。
>>> import httplib
>>> conn = httplib.HTTPConnection("www.python.org")
>>> conn.request("HEAD","/index.html")
>>> 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请求创建资源的服务器端。这是一个示例会话,显示如何使用httplib进行PUT请求:
>>> # 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