urllib3

urllib3 是一个python版的http请求库,跟urllib比,它支持 文件上传, 重用连接retry 功能

调用例子:

import urllib3
http = urllib3.PoolManager()
r = http.request('GET', 'http://example.com/')
print r.status
print r.headers['server']

Warning

注意, urllib3 在创建TCP连接的时候,会默认把 Nagle 算法禁掉, 这也是http客户端的普遍做法

实现

urllib3 是对 httplib 的包装, 发请求的时候,拼凑http请求; 收到回复的时候,解析response; timeout 也是用httplib 库的timeout参数

../../_images/software_python-lib_urllib3_impleanment.png

协议

用urllib3 库发POST请求的时候, urllib3 使用multipart格式来传递参数, 所以如果传:

{'aaa': 'bbb',
 'ccc': 'ddd'}

则发出的请求是这样的格式:

../../_images/software_python-lib_urllib3_protocol.png

Warning

这样会造成请求包较大, 因为它把多个参数分在多个part里. requests 库没有这个问题

虽然requests 内部使用了urllib3, 但是requests 却不会用multipart 方式来拼凑post 请求体。 因为它不是直接调用urllib3的 send request 方法, 而是使用其内部的connection_from_host来获取conn, 自己拼凑post body. 也就是说,两个库拼凑body的方式 不一样.