该模块定义了实现HTTP和HTTPS协议的客户端的类。它通常不直接使用 - 模块urllib使用它来处理使用HTTP和HTTPS的URL。httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块.
缺点:urllib模块里请求错误时就不会返回结果页的内容,只有头信息,对于某些需要检测错误请求返回值的场景就不适用
该模块提供了以下的类
作用:该类用于创建一个http类型的请求链接
原型:HTTPConnection(host[, port[, strict[, timeout]]])
解析:一个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)
作用:该类用于创建一个https类型的请求链接
原型:HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout]]]]])
解析:其子类HTTPConnection使用SSL与安全服务器进行通信。默认端口是443。如果指定了context,则它必须是ssl.SSLContext描述各种SSL选项的实例。
不推荐使用key_file和cert_file,请ssl.SSLContext.load_cert_chain()改为使用 ,或者 ssl.create_default_context()为您选择系统的可信CA证书。
例子:
conn3 = HTTPSConnection('wwww.cwi.n1',443,key_file,cert_file,True,10)
原型:conn.request(method, url[, body[, headers]]) method:get post head put.... url: 请求的网页路径。如:'/index.html' body: 请求是否带数据,该参数是一个字典 headers: 请求是否带头信息,该参数是一个字典,不过键的名字是指定的http头关键字
作用:发送一个请求,成功连接后返回其实例的类。不是由用户直接实例化的。
例子:
conn.request('GET', '/', '', {'user-agent':'test'})
说明:一个HTTPMessage实例用于从HTTP响应保持的标头。它是使用mimetools.Message类实现的,并提供实用程序函数来处理HTTP标头。它不是由用户直接实例化的
httplib.HTTPException
httplib.NotConnected
httplib.InvalidURL
httplib.UnknownProtocol
httplib.UnknownTransferEncoding
httplib.UnimplementedFileMode
httplib.IncompleteRead
httplib.ImproperConnectionState
httplib.CannotSendRequest
httplib.CannotSendHeader
httplib.ResponseNotReady
httplib.BadStatusLine
httplib.HTTP_PORT:HTTP协议的默认端口(始终80) httplib.HTTPS_PORT:HTTPS协议的默认端口(始终443)
说明:这将使用HTTP请求方法方法和url向服务器发送请求。如果存在body参数,则它应该是在标题完成后要发送的数据字符串。或者,它可以是一个打开的文件对象,在这种情况下发送文件的内容; 这个文件对象应该支持fileno()和read()方法。该头参数应该是额外的HTTP标头的映射与发送请求,body可以是文件对象。
说明:发送请求以从服务器获取响应后调用。返回一个HTTPResponse实例
注意:必须先读取整个响应,然后才能向服务器发送新请求
说明:设置调试级别(打印的调试输出量)。默认调试级别是0,表示不打印调试输出
说明:设置HTTP Connect Tunneling的主机和端口。通常在需要通过代理服务器进行HTTPS连接时使用。
headers参数应该是要与CONNECT请求一起发送的额外HTTP标头的映射
说明:连接到创建对象时指定的服务器
说明:关闭与服务器的连接
说明:这应该是与服务器建立连接后的第一次调用。它向服务器发送一行,包括请求字符串,选择器 字符串和HTTP版本(HTTP/1.1)。要禁用自动发送 Host:或Accept-Encoding:标头(例如接受其他内容编码),请使用非假值指定skip_host或skip_accept_encoding。
说明:发送一个 RFC822样式的服务器头。它向服务器发送一行,包括标题,冒号和空格,以及第一个参数。如果给出更多参数,则发送连续行,每个连续行由制表符和参数组成
说明:向服务器发送一个空行,表示标题的结尾。可选的message_body参数可用于传递与请求关联的消息体。如果消息正文是字符串,则消息正文将在与消息头相同的数据包中发送,否则它将在单独的数据包中发送
说明:将数据发送到服务器。只有在endheaders()调用方法之后且调用之前,才应该直接使用 getresponse()它。
说明:读取并返回响应正文,或者返回下一个amt字节。获取响应的消息体。如果请求的是一个普通的网页,那么该方法返回的是页面的html。可选参数amt表示从响应流中读取指定字节的数据
说明:获得标题的内容名称,或默认,如果没有匹配的头
说明:返回(header,value)元组的列表
说明:返回fileno底层套接字
说明:甲mimetools.Message包含响应标头实例
说明:服务器使用的HTTP协议版本。10表示HTTP / 1.0,11表示HTTP / 1.1
说明:服务器返回的状态代码
说明:服务器返回的原因短语
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服务器将允许通过请求创建资源。这是一个示例会话,显示如何使用httplib 执行 请求:HTTP PUTPOSTPUTPUT
>>> import httplib
>>> BODY = "***filecontents***"
>>> conn = httplib.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200, OK
def connection_post_response(body_data, requrl, host='10.250.115.119', port='8080'):
'''返回 response.read() response.getheaders'''
header_data = {'Host': '10.250.115.110:8080', 'token': '1', 'Content-Type': 'application/json',
'versionNumber': '8.0.11', 'mccmnc': '1', 'deviceName': 'huawei', 'softwareCompileVersion': '121',
'uuid': '12311111'}
conn = http.client.HTTPConnection(host, port)
conn.request(method='POST', url=requrl, body=json.dumps(body_data), headers=header_data)
response = conn.getresponse()
response_body = response.read()
response_headers = response.getheaders()
conn.close()
print(u'响应消息体:', response_body)
print(u'响应头:', response_headers)
return response_headers, response_body