自学Python 63 使用http包

Python 使用http包



  在Python程序中,包 http实现了对HTTP协议的封装,在本节的内容中,将详细讲解在Python程序中使用使用 http 包的知识。


一、http包介绍

  在Python语言的HTTP包中,主要包含如下表所示的模块。

模块名称描述
http.client底层的HTTP协议客户端,可以为urllib.request模块所用
http.server提供了基于socketserver模块的基本HTTP服务器类
http.cookiescookies的管理工具
http.cookiejar提供了cookies的持久化支持

  在http.client 模块中,主要包括如下两个用于客户端的类。

  (1)HTTPConnection:基于HTTP协议的访问客户端。

  (2)HTTPResponse:基于HTTP协议的服务端回应。

二、使用http.client模块

  在 http.client模块中,定义了实现 http 和 https协议客户端的类。通常来说,不能直接使用http.client模块,需要模块urllib.request调用该模块来处理 HTTP 和 HTTPS 的 URL。

1.类

  在模块http.client中包含了如下所示的类:。
  (1)类HTTPConnection
  类 HTTPConnection的语法格式如下所示:

http.client.HTTPConnection (host,port=None,[timeou,]source_address==None)

  一个 HTTPConnection实例表示与HTTP服务器端的一次事务处理,通过传递参数host地址和 port端口号进行实例化。如果没有port端口号传递参数,也可以通过传递参数,传递格式是:host:port。如果这两个参数都没有的话,则默认端口号为80。如果提供了可选参数timeout,则将在给出的秒数后执行阻塞操作表示超时。可选参数source_address可 以是一个元组,形式同(host, port),作为HTTP链接的源地址使用。

  (2)HTTPSConnection
  类HTTPSConnection的语法格式如下所示:

http.client.HTTPSConnection (host, port=None, key_file=None, cert_file=None,[timeout, ]source_ address=None, *,context=None, check_hostname=None)

  类 HTTPSConnection是 HTTPConnection的子类,使用 SSL,用于实现与服务器端的安全通信。默认端口是443。如果需要指定上下文context,必须使用ssl.SSLContext实例化,用于描述不同的SSL选项。

  (3)类HTTPResponse
  类HTTPResponse的语法格式如下所示:

class http.client.HTTPResponse (sock, debuglevel=0, method=None,url=None)

  类HTTPResponse是在连接成功后返回的实例,不需要用户直接进行实例化操作。
  (4)异常类,如下表所示。

类名称描述
exception http.client.HTTPException是本模块内其他异常的基类,本身是Exception类的子类
exception http.client.NotConnected是HTTPException类的子类
exception http.client.InvalidURL是HTTPExcention类的子类,如果端口号传参为空或不是数字型的,都会引起该异常
exception http.client.UnknownProtocol是HTTPException类的子类
exception http.client.UnknownTransferEncoding是HTTPException类的子类
exception http.client.UnimplementedFileMode是HTTPException类的子类
exception http.client.IncompleteRead是HTTPException类的子类
exception http.client.ImproperConnectionState是HTTPException类的子类
exception http.client.CannotSendRequest是 ImproperConnectionState类的子类
exception http.client.CannotSendHeader是 ImproperConnectionState类的子类
exception http.client.ResponseNotReady是 ImproperConnectionState类的子类
exception http.client.BadStatusLine是 HTTPExcention类的子类,如果服务器端响应的HTTP状态码是我们所不知道的就会引起该异常
exception http.clicnt.LineTooLong是 HTTPExcention类的子类,如果从服务器端收到超长行的HTTP协议内容就会引起该异常
exception http.client.RemoteDisconnected是类 ConnectionResetError和类 BadStatusLine 的子类。由方法HTTPConnection.getresponse()引起,当试图读取连接的响应结果时,读取不到数据,意味着远端已关闭了连接

2.HTTPConnection中的方法

  (1)HTTPConnection.request(method, url, body=None,headers={}):功能是使用指定的method 方法和 url 链接向服务器发送请求。
 ● body: 如果指定了body部分,那么 body部分将在header部分发送完之后发送过去。body部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的body类型对应不同的要求。
 ● header: 是 HTTP头部的映射,是一个字典类型。如果在header中不包含ContentLength项,那么会根据body的不同自动添加上去。

  (2) HTTPConnection.getresponse(): 功能是在请求发送后才能调用得到服务器返回的内容,返回的是一个HTTPResponse 实例。

  (3)HTTPConnection.set_debuglevel(level): 设置调试级别,默认调试级别是0,表示没有调试输出。任何大于0的值都将导致所有当前定义的调试输出被打印到stdout,debuglevel会传递到创建的任何新 HTTPResponse对象中。

  (4) HTTPConnection.set_tunnel(host, port=None, headers=None): 设置HTTP Connect隧道的主机和端口,允许通过代理服务器运行连接。

  (5) HTTPConnection.connect(): 连接指定的服务器。在默认情况下,如果客户端没有连接,则会在request请求时自动调用该方法。

  (6)HTTPConnection.close(): 关闭与服务器的连接。

  (7) HTTPConnection.putrequest(request,selector, skip_host=False, skip_accept_encoding=False): 当和服务器的链接成功后,应当首先调用这个方法。发送到服务器的内容包括: request字符串、selector字符串和HTTP协议版本。

  (8) HTTPConnection.putheader(header, argument[,…]: 发送HTTP头部到服务器,发送到服务器的内容包括: header 头部、冒号、空格和参数列表中的第一个。

  (9)HTTPConnection.endheaders(message_body=None): 发送一个空白行到服务器,标志头部的结束。其中可选参数message_body用于传递与请求相关联的消息体。如果消息头是字符串,消息体将与消息头在相同的分组中发送,否则它将在单独的分组中发送。

3. HTTPResponse中的方法

  在Python程序中,HTTPResponse实例包含了从服务器返回的HTTP回应,提供了访问请求头部和 body部分的方法。HTTPResponse是一个可迭代的对象,而且可以使用with 语句来声明。在类 HTTPResponse中包含的方法如下所示。

  (1)HTTPResnonse.read([amt]): 读取和返回 resnonse的body部
  (2)HTTPResponse.readinto(b): 读取指定的字节长度len(b),并返回到缓冲字节b,返回值是读取的字节数。
  (3)HTTPResponse.getheader(name,default=None): 返回指定名称name的HTTP头部值,如果没有相应匹配的name值,则返回默认的None。如果有多个相匹配的name值,则返回所有的值,用逗号进行分隔。
  (4)HTTPResponse.getheaders(): 以元组的形式返回所有的头部信息(header,value)。
  (5)HTTPResponse.fileno(): 返回底层套接字的 fileno。
  (6)HTTPResponse.msg: 包含响应标头的 http.client.HTTPMessage实例,http.client.HTTPMessage是email.message.Message的子类。
  (7)HTTPResponse.version: 服务器使用的HTTP 协议版本。其中10用于HTTP / 1.0,11用于HTTP/1.1。
  (8)HTTPResponse.status: 服务器返回的状态代码。
  (9)HTTPResponse.reason: 服务器返回的原因短语。
  (10)HTTPResponse.debuglevel: 调试等级,如果 debuglevel大于零,则会在读取和解析响应时将消息打印到stdout。
  (11)HTTPResponse.closed: 如果数据流已经关闭,则值为True。

三、使用HTTPConnection 对象访问指定网站

  在下面的实例中,演示了使用http.client.HTTPConnection对象访问指定网站的过程具体实现代码如下所示:

from http.client import HTTPConnection      #导入内置模块
#基于HTTP协议的访问客户端
mc = HTTPConnection('www.baidu.com:80')     #设置 GET请求方法
mc.request('GET','/')
res = mc.getresponse()      #获取访问的网页
print('以下是获取到的信息:')
print(res.status, res.reason)       #打印输出响应的状态
print(res.read().decode('utf-8'))       #显示获取的内容

  在上述实例代码中只是实现了一个基本的访问实例,首先实例httn client HTTPConnection对指定请求的方法为GET,然后使用 getresnonse()方法获取访问的网页,并打印输出响应的状态。执行会输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值