Python3中的http.client模块
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 版本中新增的。
|
1
2
3
4
5
6
7
|
>>> 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 名字的字典。
例如:
|
1
|
http.client.responses[http.client.NOT_FOUND] is 'Not Found' |
基本类
HTTPConnection 类
|
1
|
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 连接的源地址。
示例代码如下:
|
1
2
3
|
>>> 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 类
|
1
|
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 类
|
1
|
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 ,说明连接已关闭。
示例
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import http.clientimport urllib,parser# # 初始化一个 https 链接conn = http.client.HTTPSConnection("www.python.org")# 指定 request 请求的方法和请求的链接地址conn.request("GET","/doc/")# 得到返回的 http responser1 = 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() |
Python3中的http.client模块的更多相关文章
- python3 中引用 HTMLTestRunner.py 模块的注意事项
HTMLTestRunner.py支持python2中运行,如果在python3.6.2中引用HTMLTestRunner.py模块,需要做一下更改: 1.更改HTMLTestRunner.py模块中 ...
- Python3中无法导入ssl模块的解决办法
这个问题,已经困扰我好几天了,本萌新刚开始接触python,想爬取几个网页试试,发现urllib无法识别https,百度后才知道要导入ssl模块,可是发现又报错了. 本人实在无法理解为什么会报错,因为 ...
- python3中的os.path模块
os.path模块主要用于获取文件的属性,这里对该模块中一些常用的函数做些记录. os.abspath(path):获取文件的绝对路径.这里path指的是路径,例如我这里输入"data.cs ...
- python3中,os.path模块下常用的用法总结
abspath basename dirname exists getatime getctime getmtime getsize isabs isdir isfile islink ismount ...
- 详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.urllib2可以接受一个Request类的实例来设置URL请求的hea ...
- python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)
在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...
- python之模块copy_reg(在python3中为copyreg,功能基本不变)
# -*- coding: utf-8 -*-#python 27#xiaodeng#python之模块copy_reg(在python3中为copyreg,功能基本不变) import copy_r ...
- python之模块配置文件ConfigParser(在python3中变化较大)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ConfigParser(在python3中为configparser) #特别注意:py ...
- 把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案
把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败在python3中调用会成功,但是调用不能成功 解决办法是: 在该文件夹下加入空文件__init__.py python2会把该 ...
随机推荐
- “玲珑杯”ACM比赛 Round #13 B -- 我也不是B(二分排序)
题意:开始有一个空序列s,一个变量c=0,接着从左往右依次将数组a中的数字放入s的尾部,每放一个数字就检测一次混乱度K,当混乱度k大于M时就清空序列并让c=c+1 K = Bi * Vi(1<= ...
- Android中APK安装过程及原理解析
[原文] 来自华为内部资料 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作.APK是Android Package的缩写,即android安装包 ...
- Javascript -- 示例:多选下拉选框
1. 示例:多选下拉选框 <html> <head> <meta http-equiv="Content-Type" content="te ...
- KindEditor 上传文件
Jsp页面代码: <script> var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name= ...
- MSSQL旋转和反旋转的例子
1.旋转 ;WITH CTE AS ( AS VAL UNION ALL UNION ALL UNION ALL UNION ALL UNION ALL UNION ALL UNION ALL ) S ...
- ArrayList、Vector、LinkedList(jdk8)
一.ArrayList分析 1.类和构造方法 public class ArrayList<E> extends AbstractList<E> //可以看到其父类是Abstr ...
- 理解RESTful风格(转)
原文链接:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件 ...
- New Concept English three (39)
26w/m 70errors The rough across the plain soon became so bad that we tried to get Bruce to drive bac ...
- canvas - 柱子效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Python爬虫--抓取糗事百科段子
今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...