深入理解Python3中的http.client模块


Posted in Python onMarch 29, 2017

http 模块简介

Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块。

  • http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
  • http.server 包含基于 socketserver 的基本 HTTP 服务器的类。
  • http.cookies 实现 cookie 状态管理
  • http.cookiejar 与 cookie 相关

http 模块还定义了一系列的 HTTP 状态码。

HTTPStatus 类是在 Python 3.5 版本中新增的。

>>> from http import HTTPStatus
>>> HTTPStatus.OK<HTTPStatus.OK: 200>
>>> HTTPStatus.OK == 200True
>>> http.HTTPStatus.OK.value200
>>> HTTPStatus.OK.phrase'OK'
>>> HTTPStatus.OK.description'Request fulfilled, document follows'
>>> list(HTTPStatus)[<HTTPStatus.CONTINUE: 100>, <HTTPStatus.SWITCHING_PROTOCOLS: 101>, ...]

具体的 HTTP 状态码和相应的说明可以在 Python 的官方文档上找到: https://docs.python.org/3/library/http.html

http.client 模块

http.client 模块定义了实现 http 和 https 协议客户端的类。

该模块通常不会直接使用,而是用封装好的 urllib.request 模块来使用他们处理 URL 。

常量

http 模块中的常量:

1、http.client.HTTP_PORT

http 协议默认的端口号,总是 80 端口

2、http.client.HTTPS_PORT

https 协议默认的端口号,总是 443 端口

3、http.client.responses

将 HTTP 1.1 状态码映射到 W3C 名字的字典。

例如:

http.client.responses[http.client.NOT_FOUND] is 'Not Found'

基本类

HTTPConnection 类

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

HTTPConnection 实例表示与 HTTP 服务器的事务。

实例化 HTTPConnection 时应该传递一个主机和可选的端口号。如果没有传递端口,而主机字符串是以 host:port 的形式,则会提取出端口值,否则将使用默认的 8- 端口。

如果给定了可选参数 timeout ,阻塞操作将会在给定的时间后超时,若未给定,则使用默认的全局 timeout 设置。

可选参数 source_address 应该以 host 和 port 的元组形式 (host,port),用来作为 HTTP 连接的源地址。

示例代码如下:

>>> h1 = http.client.HTTPConnection('www.python.org')
>>> h2 = http.client.HTTPConnection('www.python.org:80')>>> h3 = http.client.HTTPConnection('www.python.org', 80)
>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)

source_address 是在 3.2 版本中添加的。

strict 参数在 3.4 版本中移除了。

HTTPSConnection 类

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 选项。

key_file 和 cert_file 已经被弃用了,取而代之的是 ssl.SSLContext.load_cert_chain() 。或者使用 ssl.create_default_context() 选择系统信任的 CA 证书。

check_hostname 参数也被弃用了,使用 context 的 ssl.SSLContext.check_hostname 属性。

HTTPResponse 类

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

一旦连接成功就会返回该实例,该类的对象不能由用户直接实例化。

HTTPMessage 类

HTTPMessage 实例持有从 HTTP response 返回的头部。

异常类

HTTPException 类

Exception 类的子类,也是 http 模块中其他异常类的基类。
其他异常类:

  • NotConnected
  • InvalidURL
  • UnknownProtocol
  • UnknownTransferEncoding
  • UnimplementedFileMode
  • IncompletedRead
  • ImproperConnectionState
  • BadStatusLine
  • LineTooLong
  • CannotSendRequest
  • CannotSendHeader
  • ResponseNotReady
  • RemoteDisconnected

类方法

HTTPConnection 对象方法

HTTPConnection 实例有如下的方法 :

1、HTTPConnection.request(method, url, body=None, headers={})

使用指定的 method 方法和 url 链接向服务器发送请求。

如果指定 了body 部分,那么 body 部分将在 header 部分发送完之后发送过去。body 部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的 body 类型对应不同的要求。

header 参数应该是 HTTP 头部的映射,是一个字典类型。

如果 header 中不包含 Content-Length 项,那么会根据 body 的不同来自动添加上去。

2、HTTPConnection.getresponse()

必须在请求发送后才能调用得到服务器返回的内容,返回的是一个 HTTPResponse 实例。

3、HTTPConnection.set_debuglevel(level)

设置调试级别,默认调试级别是 0 ,意味着没有调试输出。

4、HTTPConnection.set_tunnel(host, port=None, headers=None)

设置 HTTP 隧道链接的主机和端口,这允许连接使用代理服务器。

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)

发送一个空白行到服务器,标识头部的结束。

10、HTTPConnection.send(data)

发送数据到服务器。

应该在 endheaders() 方法之后和在 getresponse() 方法之前调用。

HTTPResponse 对象方法

HTTPResponse 实例包含了从服务器返回的 HTTP 回应。

它提供了访问请求头部和 body 部分的方法。

HTTPResponse 是一个可迭代的对象而且可以使用 with 语句来声明。

HTTPResponse 实例有如下的方法 :

1、HTTPResponse.read([amt])

读取和返回 response 的 body 部分。

2、HTTPResponse.readinto(b)

读取指定的字节长度 len(b),并返回到缓冲字节 b 。

函数返回读取的字节数

3、HTTPResponse.getheader(name,default=None)

返回指定名称 name 的 HTTP 头部值,如果没有相应匹配的 name 值,则返回默认的 None。如果有多个相匹配的,则返回所有的值,以逗号分隔。

4、HTTPResponse.getheaders()

以元组的形式返回所有的头部信息 (header,value)。

5、HTTPResponse.fileno()

6、HTTPResponse.msg

7、HTTPResponse.version。

HTTP 协议版本

8、HTTPResponse.status

HTTP 状态码

9、HTTPResponse.reason

10、HTTPResponse.debuglevel

11、HTTPResponse.closed

如果为 True ,说明连接已关闭。

示例

import http.client
import urllib,parser
# # 初始化一个 https 链接
conn = http.client.HTTPSConnection("www.python.org")
# 指定 request 请求的方法和请求的链接地址
conn.request("GET","/doc/")
# 得到返回的 http response
r1 = conn.getresponse()
# HTTP 状态码
print(r1.status,r1.reason)
# HTTP 头部
print(r1.getheaders())
# body 部分
print(r1.read())
# 如果连接没有关闭,打印输出前 200 个字节
if not r1.closed:
 print(r1.read(200))
# 关闭连接后才能重新请求
conn.close()
# 请求一个不存在的文件或地址
conn.request("GET","/parrot.spam")
r2 = conn.getresponse()
print(r2.status,r2.reason)
conn.close()
# 使用 HEAD 请求,但是不会返回任何数据
conn = http.client.HTTPSConnection("www.python.org")
conn.request("HEAD","/")
res = conn.getresponse()
print(res.status,res.reason)
data = res.read()
print(len(data))
conn.close()
# 使用 POST 请求,提交的数据放在 body 部分
params = urllib.parse.urlencode({'@number':12524,'@type':'issue','@action':'show'})
# post 请求数据,要带上 Content-type 字段,以告知消息主体以何种方式编码
headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"}
conn = http.client.HTTPConnection("bugs.python.org")
conn.request("POST","/",params,headers)
response = conn.getresponse()
# 访问被重定向
print(response.status,response.reason)
print(response.read().decode("utf-8"))
conn.close()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
python下10个简单实例代码
Nov 15 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 Python
Python 中迭代器与生成器实例详解
Mar 29 #Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 #Python
windows系统下Python环境搭建教程
Mar 28 #Python
Python中Django 后台自定义表单控件
Mar 28 #Python
windows上安装Anaconda和python的教程详解
Mar 28 #Python
利用python爬取软考试题之ip自动代理
Mar 28 #Python
详解python调度框架APScheduler使用
Mar 28 #Python
You might like
将PHP作为Shell脚本语言使用
2006/10/09 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
python算的上脚本语言吗
2020/06/22 Python
Pycharm中如何关掉python console
2020/10/27 Python
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
物业保安辞职信
2015/05/12 职场文书
办公室日常管理制度
2015/08/04 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
php实例化对象的实例方法
2021/11/17 PHP
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS