当前位置: 首页 > 工具软件 > HttpLib > 使用案例 >

Python学习笔记 -- Httplib库

袁宜民
2023-12-01

httplib简介

  •  该模块定义了实现HTTP和HTTPS协议的客户端的类。它通常不直接使用 - 模块urllib使用它来处理使用HTTP和HTTPS的URL。httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块.

  •  缺点:urllib模块里请求错误时就不会返回结果页的内容,只有头信息,对于某些需要检测错误请求返回值的场景就不适用

该模块提供了以下的类

  • class httplib.HTTPConnection

作用:该类用于创建一个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)
  • class httplib.HTTPSConnection

作用:该类用于创建一个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)
  • class httplib.HTTPResponse

原型:conn.request(method, url[, body[, headers]]) method:get post head put.... url: 请求的网页路径。如:'/index.html' body: 请求是否带数据,该参数是一个字典 headers: 请求是否带头信息,该参数是一个字典,不过键的名字是指定的http头关键字

作用:发送一个请求,成功连接后返回其实例的类。不是由用户直接实例化的。

例子:

conn.request('GET', '/', '', {'user-agent':'test'})
  • httplib.HTTPMessage

说明:一个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连接对象

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

说明:这将使用HTTP请求方法方法和url向服务器发送请求。如果存在body参数,则它应该是在标题完成后要发送的数据字符串。或者,它可以是一个打开的文件对象,在这种情况下发送文件的内容; 这个文件对象应该支持fileno()和read()方法。该头参数应该是额外的HTTP标头的映射与发送请求,body可以是文件对象。

  • HTTPConnection.getresponse()

说明:发送请求以从服务器获取响应后调用。返回一个HTTPResponse实例

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

  • HTTPConnection.set_debuglevel(level)

说明:设置调试级别(打印的调试输出量)。默认调试级别是0,表示不打印调试输出

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

说明:设置HTTP Connect Tunneling的主机和端口。通常在需要通过代理服务器进行HTTPS连接时使用。

headers参数应该是要与CONNECT请求一起发送的额外HTTP标头的映射

  • HTTPConnection.connect()

说明:连接到创建对象时指定的服务器

  • HTTPConnection.close()

说明:关闭与服务器的连接

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

说明:这应该是与服务器建立连接后的第一次调用。它向服务器发送一行,包括请求字符串,选择器 字符串和HTTP版本(HTTP/1.1)。要禁用自动发送 Host:或Accept-Encoding:标头(例如接受其他内容编码),请使用非假值指定skip_host或skip_accept_encoding。

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

说明:发送一个 RFC822样式的服务器头。它向服务器发送一行,包括标题,冒号和空格,以及第一个参数。如果给出更多参数,则发送连续行,每个连续行由制表符和参数组成

  • HTTPConnection.endheaders(message_body =None)

说明:向服务器发送一个空行,表示标题的结尾。可选的message_body参数可用于传递与请求关联的消息体。如果消息正文是字符串,则消息正文将在与消息头相同的数据包中发送,否则它将在单独的数据包中发送

  • HTTPConnection.send(data)

说明:将数据发送到服务器。只有在endheaders()调用方法之后且调用之前,才应该直接使用 getresponse()它。

 HTTPResponse对象

  • HTTPResponse.read([ amt ] )

说明:读取并返回响应正文,或者返回下一个amt字节。获取响应的消息体。如果请求的是一个普通的网页,那么该方法返回的是页面的html。可选参数amt表示从响应流中读取指定字节的数据

  • HTTPResponse.getheader(name[,default] )

说明:获得标题的内容名称,或默认,如果没有匹配的头

  • HTTPResponse.getheaders()

说明:返回(header,value)元组的列表

  • HTTPResponse.fileno()

说明:返回fileno底层套接字

  • HTTPResponse.msg

说明:甲mimetools.Message包含响应标头实例

  • HTTPResponse.version

说明:服务器使用的HTTP协议版本。10表示HTTP / 1.0,11表示HTTP / 1.1

  • HTTPResponse.status

说明:服务器返回的状态代码

  • HTTPResponse.reason

说明:服务器返回的原因短语

例子:

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
 类似资料: