python模块介绍-httplib:HTTP协议客户端

jopen 10年前

注意:httplib模块在Python3.0中已更名为http.client。2to3脚本会自动修改import当你的源代码转换时到3.0时。

httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的HTTP和HTTPS实现。其中HTTPS需要socket编译了SSL支持。HTTP类仅仅是和python1.5.2及以前的版本兼容,不推荐使用。

代码:Lib/httplib.py

接口

基本类

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

HttpConnection的实例表示与HTTP服务器的事务。实例化时需要传递主机和可选的端口号。如果没有端口号,试图以host:port格式从主机字符串提取,如果提取失败则使用默认的HTTP端口(80)。参数strict默认为false,表示在无法解析状态行时(status line)不能被HTTP/1.0或1.1解析时不抛出BadStatusLine异常;可选参数timeout表示即阻塞在多少秒后超时,如果没有给出默认使用全局超时设置。可选参数source_address表示HTTP的源地址(host, port)。

timeout为2.6添加,source_address为2.7添加。

>>> import httplib>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com')>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com:80')>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com',80)>>> h1 = httplib.HTTPConnection('automationtesting.sinaapp.com',80, timeout=10)
  • class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address]]]]]])

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

注意不支持验证服务器的证书。timeout为2.6添加,source_address为2.7添加。

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

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

  • class httplib.HTTPMessage

HTTPMessage实例用于保存HTTP响应头。它使用mimetools.Message类实现,并提供了处理HTTP头的工具函数。它不直接实例化的用户。不能由用户实例化。

异常

  • exception httplib.HTTPException

Exception的子类,此模块中的其他异常的基类。下面的类默认是该类的直接子类。

  • httplib.NotConnected

  • httplib.InvalidURL

  • httplib.UnknownProtocol

  • httplib.UnknownTransferEncoding

  • httplib.UnimplementedFileMode

  • httplib.IncompleteRead

  • httplib.ImproperConnectionState

  • httplib.CannotSendRequest

ImproperConnectionState的一个子类。

  • httplib.CannotSendHeader

ImproperConnectionState的一个子类。

  • httplib.ResponseNotReady

ImproperConnectionState的一个子类。

  • httplib.BadStatusLine

服务器返回的HTTP状态码不认识时产生。

常量和类变量

  • httplib.HTTP_PORT:HTTP协议的默认端口,恒为80。

  • httplib.HTTPS_PORT:HTTPS协议的默认端口,恒为443。

  • httplib.responses:映射HTTP1.1状态代码映射到W3C的名字的字典。2.5新增

>>> httplib.responses[httplib.NOT_FOUND]'Not Found'

HTTPConnection类的方法

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

发送请求HTTP请求到服务器,使用方法method和指定的地址url。如果有body,一般是字符串数据,将在headers之后发送。当然body也可以是支持fileno()和read()方法的文件对象,这时会发送文件内容。header内容长度会自动填充为正确的值,headers是额外HTTP头的映射,会和请求一起发送。2.6开始支持文件对象。

  • HTTPConnection.getresponse()

用于在请求发送以后从服务器端获取响应。返回HTTPResponse实例。注意发送下一条请求之前必须读完整个响应。

  • HTTPConnection.set_debuglevel(level)

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

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

设置HTTP连接隧道的主机和端口。需要通过代理服务器做HTTPS连接时使用。header参数必须为额外HTTP头的映射随CONNECT一起发送。2.7新增。

  • HTTPConnection.connect()

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

  • HTTPConnection.close()

关闭到服务器的连接。

下面四个函数可以代替request()一步步发送请求。

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

连接到服务器后的第一个调用。它发送由request字符串,selector字符串, HTTP版本(HTTP/1.1)的行数据到服务器。设置skip_host为非Fasle值可禁用自动发送主机,设置skip_accept_encoding为非Fasle值可禁用接受编码。skip_accept_encoding为2.4添加。

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

发送一个RFC 822样式头到服务器。它发送由header,一个冒号和一个空格,第一个参数到服务器。如果有更多参数会发送多行,每行由一个tab和一个参数组成。

  • HTTPConnection.endheaders(message_body=None)

发送空行到服务器,指示header的结束。可选的optional message_body参数可以用来传递与请求相关的消息体。消息体如果是字符串将在消息头的包发送,如果它是字符串,否则用单独数据包。2.7加入message_body。

  • HTTPConnection.send(data)

将数据发送到服务器。endheaders()之后,getresponse()之前使用。

HTTPResponse类的方法

  • HTTPResponse.read([amt])

读取并返回response的body,或下面的amt字节。

  • HTTPResponse.getheader(name[, default])

获得头名,如果没有匹配的头返回default。

  • HTTPResponse.getheaders()

返回(header, value)元组构成的列表。2.4新增。

  • HTTPResponse.fileno()

返回底层套接字的的fileno。

  • HTTPResponse.msg

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

  • HTTPResponse.version

服务器使用的HTTP协议版本。10表示HTTP/1.011表示HTTP/1.1。

  • HTTPResponse.status

由服务器返回的状态代码。

  • HTTPResponse.reason

服务器的原因短语。

实例

HTTP GET

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplibconn = httplib.HTTPConnection("www.python.org")conn.request("GET", "/index.html")r1 = conn.getresponse()print r1.status, r1.reason#data1 = r1.read()print data1  conn.request("GET", "/parrot.spam")r2 = conn.getresponse()print r2.status, r2.reason  data2 = r2.read()#print data2conn.close()

执行结果

# ./http_get.py   200 OK  404 Not Found

HTTP HEAD

注意HEAD不会返回任何数据。

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplibconn = httplib.HTTPConnection("www.python.org")conn.request("HEAD","/index.html")res = conn.getresponse()print res.status, res.reason  data = res.read()print len(data)print data == ''conn.close()

执行结果

# ./http_head.py   200 OK  0  True

HTTP POST

#!/usr/bin/env python# -*- coding: utf-8 -*-import httplib, urllibparams = 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  data = response.read()print data  conn.close()

执行结果

# ./http_head.py   # ./test.py   302 Found  Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>

HTTP PUT

客户端的HTTP PUT请求和POST类似。不同之处在于服务器端允许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 resp.status, response.reason200, OK

本文地址