深入理解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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python 不同对象比较大小示例探讨
Aug 21 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
对pandas中apply函数的用法详解
Apr 10 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
Python换行与不换行的输出实例
Feb 19 Python
浅谈Python中的模块
Jun 10 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
python/golang实现循环链表的示例代码
Sep 14 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
Pygame Time时间控制的具体使用详解
Nov 17 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 正则 过滤html 的超链接
2009/06/02 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
php四种基础算法代码实例
2013/10/29 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
scrapy爬虫完整实例
2018/01/25 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
python批量生成条形码的示例
2020/10/10 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
公司委托书格式范文
2014/04/04 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
珍惜资源的建议书
2014/08/26 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
北京英文导游词
2015/02/12 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
反邪教教育心得体会
2016/01/15 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
七年级作文之游记
2019/12/11 职场文书
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL
Vue Element plus使用方法梳理
2022/12/24 Vue.js