深入理解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中的迭代器漫谈
Feb 03 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
Python实现代码统计工具(终极篇)
Jul 04 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
Django进阶之CSRF的解决
Aug 01 Python
用Python实现大文本文件切割的方法
Jan 12 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
python 用struct模块解决黏包问题
Nov 07 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 编写大型网站问题集
2010/05/07 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
python挖矿算力测试程序详解
2019/07/03 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python 求定积分和不定积分示例
2019/11/20 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
文科教师毕业的自我评价
2014/01/16 职场文书
预备党员承诺书
2014/03/25 职场文书
政府法律服务方案
2014/06/14 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
汽车转让协议书范本
2014/12/07 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
优质护理心得体会
2016/01/22 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL