httplib

注意

httplib模块已被重命名为http.clientPython 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_filecert_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未设置标题除外期望的主体(方法PUTPOSTPATCH),在该情况下,它被设定为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_hostskip_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

扫码关注云+社区

领取腾讯云代金券