HTTP协议 - 白月黑羽
HTTP协议简介
如果客户端是浏览器,如何在chrome浏览器中查看 请求和响应的HTTP消息?按f12-》network
清除当前信息
响应的消息体在Response里看
点preview,可以看响应的消息体展开的格式
HTTP请求消息
请求头 request headers
提供信息给服务端
User-Agent:
客户端的类型。客户端不一定是浏览器。客户端和服务端(HTTP协议)不仅是浏览器和服务器之间,任何两个软件之间都可以使用HTTP协议。
Accept-Language
客户端希望服务端使用中文
请求体 /消息体
状态行 status line
以前的url 可能是a/b/c,后面可能变成了a/b/d,当再用以前的url访问时,就会返回3XX,代表重定向,相应的响应消息头里会告诉新的url是哪一个
抓包工具 fiddler
只有url中包含customer才显示
requests库 和 session
构建请求消息体
http://httpbin.org/post
将要发送的网址加到fiddler
json 格式消息体
dumps把python中的对象序列化为json格式的字符串
中文会变成对应的unicode
import requests,jsonpayload = {"Overall":"良好","Progress":"30%","Problems":[{"No" : 1,"desc": "问题1...."},{"No" : 2,"desc": "问题2...."},]
}r = requests.post("http://httpbin.org/post", data=json.dumps(payload))
中文会变成对应的unicode
如果不想中文变成unicode编码,可以 写成
data=json.dumps(payload, ensure_ascii=False)
但是这样的话,字符串带有中文,编码方式就得是utff8了,不然ascill码不够用,不能用缺省的latin-1
编码
data=json.dumps(payload, ensure_ascii=False).encode("utf-8")。
dumps把python中的对象序列化为json格式的字符串
loads把json格式的字符串反序列化为python中的对象
这样写有点麻烦
也可以将 数据对象 直接 传递给post方法的 json参数,如下
r = requests.post("http://httpbin.org/post", json=payload)
虽然中文对应的也是unicode但是接收端会处理
检查响应消息体
发出去的是字节串,接收的原始消息也是字节串
text获取文本内容,也就是字符串。从字节串到字符串意味着其中有一个解码的过程。
那么,requests是 以什么编码格式 把HTTP响应消息体中的 字节串 解码 为 字符串的呢?
requests 会根据响应消息头(比如 Content-Type)对编码格式做推测。
但是有时候,服务端并不一定会在消息头中指定编码格式,这时, requests的推测可能有误(打印 response.encoding 可以看到推测的解码方式),需要我们指定编码格式。