20.7。 httplib - HTTP协议客户端

Note

Python 3中已将httplib模块重命名为http.client当您将源转换为Python 3时,2to3工具将自动调整导入。

Source code: Lib/httplib.py

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

Note

仅当使用SSL支持编译套接字模块时,才能使用HTTPS支持。

Note

该模块的公共接口在Python 2.0中发生了重大变化。HTTP类仅保留与1.5.2的向后兼容性。它不应该在新的代码中使用。有关使用方法,请参阅在线文档。

该模块提供以下类:

class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])

一个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已添加。

class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address]]]]]])

使用SSL与安全服务器进行通信的HTTPConnection的子类。默认端口为443key_file是包含您的私钥的PEM格式文件的名称。cert_file是一个PEM格式的证书链文件。

Warning

这不会对服务器的证书进行任何验证。

New in version 2.0.

在版本2.6中更改: timeout已添加。

在版本2.7中更改: source_address已添加。

class httplib.HTTPResponse(sock, debuglevel=0, strict=0)

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

New in version 2.0.

class httplib.HTTPMessage

一个HTTPMessage实例用于保存HTTP响应中的头。它使用mimetools.Message类实现,并提供实用功能来处理HTTP头。它不是用户直接实例化的。

以下例外情况适当提出:

exception httplib.HTTPException

本模块中其他异常的基类。它是异常的子类。

New in version 2.0.

exception httplib.NotConnected

HTTPException的子类。

New in version 2.0.

exception httplib.InvalidURL

HTTPException的子类,如果给出端口,则为非数字或空值。

New in version 2.3.

exception httplib.UnknownProtocol

HTTPException的子类。

New in version 2.0.

exception httplib.UnknownTransferEncoding

HTTPException的子类。

New in version 2.0.

exception httplib.UnimplementedFileMode

HTTPException的子类。

New in version 2.0.

exception httplib.IncompleteRead

HTTPException的子类。

New in version 2.0.

exception httplib.ImproperConnectionState

A subclass of HTTPException.

New in version 2.0.

exception httplib.CannotSendRequest

A subclass of ImproperConnectionState.

New in version 2.0.

exception httplib.CannotSendHeader

A subclass of ImproperConnectionState.

New in version 2.0.

exception httplib.ResponseNotReady

A subclass of ImproperConnectionState.

New in version 2.0.

exception httplib.BadStatusLine

A subclass of HTTPException. 如果服务器使用我们不了解的HTTP状态代码进行响应,则引发。

New in version 2.0.

本模块中定义的常数为:

httplib.HTTP_PORT

HTTP协议的默认端口(始终为80)。

httplib.HTTPS_PORT

HTTPS协议的默认端口(始终为443)。

以及整数状态代码的以下常量:

ConstantValueDefinition
CONTINUE100HTTP/1.1, RFC 2616, Section 10.1.1
SWITCHING_PROTOCOLS101HTTP/1.1, RFC 2616, Section 10.1.2
PROCESSING102WEBDAV, RFC 2518, Section 10.1
OK200HTTP/1.1, RFC 2616, Section 10.2.1
CREATED201HTTP/1.1, RFC 2616, Section 10.2.2
ACCEPTED202HTTP/1.1, RFC 2616, Section 10.2.3
NON_AUTHORITATIVE_INFORMATION203HTTP/1.1, RFC 2616, Section 10.2.4
NO_CONTENT204HTTP/1.1, RFC 2616, Section 10.2.5
RESET_CONTENT205HTTP/1.1, RFC 2616, Section 10.2.6
PARTIAL_CONTENT206HTTP/1.1, RFC 2616, Section 10.2.7
MULTI_STATUS207WEBDAV RFC 2518, Section 10.2
IM_USED226Delta encoding in HTTP, RFC 3229, Section 10.4.1
MULTIPLE_CHOICES300HTTP/1.1, RFC 2616, Section 10.3.1
MOVED_PERMANENTLY301HTTP/1.1, RFC 2616, Section 10.3.2
FOUND302HTTP/1.1, RFC 2616, Section 10.3.3
SEE_OTHER303HTTP/1.1, RFC 2616, Section 10.3.4
NOT_MODIFIED304HTTP/1.1, RFC 2616, Section 10.3.5
USE_PROXY305HTTP/1.1, RFC 2616, Section 10.3.6
TEMPORARY_REDIRECT307HTTP/1.1, RFC 2616, Section 10.3.8
BAD_REQUEST400HTTP/1.1, RFC 2616, Section 10.4.1
UNAUTHORIZED401HTTP/1.1, RFC 2616, Section 10.4.2
PAYMENT_REQUIRED402HTTP/1.1, RFC 2616, Section 10.4.3
FORBIDDEN403HTTP/1.1, RFC 2616, Section 10.4.4
NOT_FOUND404HTTP/1.1, RFC 2616, Section 10.4.5
METHOD_NOT_ALLOWED405HTTP/1.1, RFC 2616, Section 10.4.6
NOT_ACCEPTABLE406HTTP/1.1, RFC 2616, Section 10.4.7
PROXY_AUTHENTICATION_REQUIRED407HTTP/1.1, RFC 2616, Section 10.4.8
REQUEST_TIMEOUT408HTTP/1.1, RFC 2616, Section 10.4.9
CONFLICT409HTTP/1.1, RFC 2616, Section 10.4.10
GONE410HTTP/1.1, RFC 2616, Section 10.4.11
LENGTH_REQUIRED411HTTP/1.1, RFC 2616, Section 10.4.12
PRECONDITION_FAILED412HTTP/1.1, RFC 2616, Section 10.4.13
REQUEST_ENTITY_TOO_LARGE413HTTP/1.1, RFC 2616, Section 10.4.14
REQUEST_URI_TOO_LONG414HTTP/1.1, RFC 2616, Section 10.4.15
UNSUPPORTED_MEDIA_TYPE415HTTP/1.1, RFC 2616, Section 10.4.16
REQUESTED_RANGE_NOT_SATISFIABLE416HTTP/1.1, RFC 2616, Section 10.4.17
EXPECTATION_FAILED417HTTP/1.1, RFC 2616, Section 10.4.18
UNPROCESSABLE_ENTITY422WEBDAV, RFC 2518, Section 10.3
LOCKED423WEBDAV RFC 2518, Section 10.4
FAILED_DEPENDENCY424WEBDAV, RFC 2518, Section 10.5
UPGRADE_REQUIRED426HTTP Upgrade to TLS, RFC 2817, Section 6
INTERNAL_SERVER_ERROR500HTTP/1.1, RFC 2616, Section 10.5.1
NOT_IMPLEMENTED501HTTP/1.1, RFC 2616, Section 10.5.2
BAD_GATEWAY502HTTP/1.1 RFC 2616, Section 10.5.3
SERVICE_UNAVAILABLE503HTTP/1.1, RFC 2616, Section 10.5.4
GATEWAY_TIMEOUT504HTTP/1.1 RFC 2616, Section 10.5.5
HTTP_VERSION_NOT_SUPPORTED505HTTP/1.1, RFC 2616, Section 10.5.6
INSUFFICIENT_STORAGE507WEBDAV, RFC 2518, Section 10.6
NOT_EXTENDED510An HTTP Extension Framework, RFC 2774, Section 7
httplib.responses

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.

20.7.1. HTTPConnection对象

HTTPConnection instances have the following methods:

HTTPConnection.request(method, url[, body[, headers]])

这将使用HTTP请求方法方法和选择器url向服务器发送请求。如果body参数存在,则它应该是头文件完成后要发送的一串数据。或者,它可以是打开的文件对象,在这种情况下文件的内容被发送;这个文件对象应该支持fileno()read()方法。标题Content-Length自动设置为正确的值。参数应该是要发送的额外HTTP头的映射。

在版本2.6中更改: body可以是一个文件对象。

HTTPConnection.getresponse()

from the serverReturns an HTTPResponse instance.

Note

请注意,您必须先阅读整个响应,然后才能向服务器发送新的请求。

HTTPConnection.set_debuglevel(level)

设置调试级别(打印调试输出量)。默认调试级别为0,表示没有打印调试输出。

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

设置HTTP连接隧道的主机和端口。通常需要通过代理服务器进行HTTPS连接时使用。

头参数应该是使用CONNECT请求发送的额外HTTP头的映射。

New in version 2.7.

HTTPConnection.connect()

连接到创建对象时指定的服务器。

HTTPConnection.close()

关闭与服务器的连接。

作为使用上述request()方法的替代方法,您还可以通过使用以下四个功能逐步发送请求。

HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])

这应该是连接到服务器之后的第一个调用。它向由请求字符串,选择器字符串和HTTP版本(HTTP / 1.1)组成的服务器发送一行。要禁用Host:Accept-Encoding:标头的自动发送(例如,接受其他内容编码),请指定skip_hostskip_accept_encoding带有非False值。

Changed in version 2.4: skip_accept_encoding argument added.

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

向服务器发送一个 RFC 822标题。它将一行发送到由头,冒号和空格组成的服务器和第一个参数。如果给出更多的参数,则会发送连续行,每行包含一个选项卡和一个参数。

HTTPConnection.endheaders(message_body=None)

发送一条空行到服务器,标示头的结尾。可选的message_body参数可用于传递与请求相关联的邮件正文。如果消息主体是字符串,消息体将与消息标头相同的数据包发送,否则将以单独的数据包发送。

Changed in version 2.7: message_body was added.

HTTPConnection.send(data)

将数据发送到服务器。只有在调用了endheaders()方法之后,才调用getresponse()之前,才能直接使用。

20.7.2. HTTPResponse Objects

HTTPResponse实例具有以下方法和属性:

HTTPResponse.read([amt])

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

HTTPResponse.getheader(name[, default])

如果没有匹配的标题,获取标题名称默认的内容。

HTTPResponse.getheaders()

返回(header,value)元组的列表。

New in version 2.4.

HTTPResponse.fileno()

返回底层套接字的fileno

HTTPResponse.msg

包含响应头的mimetools.Message实例。

HTTPResponse.version

服务器使用的HTTP协议版本。10 for HTTP/1.0, 11 for HTTP/1.1.

HTTPResponse.status

服务器返回的状态码。

HTTPResponse.reason

服务器返回的原因短语。

20.7.3. Examples

以下是使用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