注意: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。
状态常量:参见http://docs.python.org/2/library/httplib.html
httplib.responses:映射HTTP1.1状态代码映射到W3C的名字的字典。2.5新增
>>> httplib.responses[httplib.NOT_FOUND]'Not Found'
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.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
服务器的原因短语。
#!/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
注意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
#!/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请求和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
http://automationtesting.sinaapp.com/blog/m_httplib
本站地址:python自动化测试http://automationtesting.sinaapp.com python开发自动化测试群113938272和开发测试群6089740 微博 http://weibo.com/cizhenshi
httplib python2文档: hhttp://docs.python.org/2/library/httplib.html
《The Python Standard Library by Example 2011》