在中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱。
疑惑在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/x-www-form-urlencoded)的方式,而是上传文件(multipart/form-data),这是为什么呢?知乎登录post请求该怎么发送呢?
本质我想说的是一般情况下是使用提交Form表单的方式进行登录,但是不排除其他的方式。大家要透过现象看本质,登录验证的本质上是客户端发送验证消息,服务端校验消息,返回响应。登录验证可以使用提交Form表单,可以使用发送ajax,也可以上传验证文件,甚至我不用http请求,使用Websocket,都是可以的,这没必要纠结。好多朋友在知乎登录的时候,就傻眼了?这个怎么使用requests发送post请求呢?
新版知乎登录分析首先打开谷歌浏览器,同时F12,打开开发者模式,并勾选Preserve log。
接着在知乎登录首页,输入账号与密码,开始登录。(这次不涉及验证码的分析)
知乎登录请求如下图,大家肯定注意到了content-type: multipart/form-data; boundary=----WebKitFormBoundarypxPm5bUFaA8CHOHo。不仅不是Form表单提交,而且和之前讲的上传文件还有区别,即boundary的配置。
requests模拟知乎登录上一篇文章里的文件上传,post函数里使用的是files参数,通过这个参数来表明使用的是multipart/form-data编码,这里不再是通过files参数传文件,而是传参数,其实本质上一样的,文件内容不就是这参数吗?好,为了测试方便,向 发送post请求,代码如下:
import requests url = "http://httpbin.org/post" fields = { "client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20", "grant_type": "password", "timestamp": "1527040472416", "source": "com.zhihu.web", "signature":"66a16483ab16e54c3bb4ef84bf683dd67cadc246", "username": "xxxxx@qq.com", "password": "xxxxxxxx" } res = requests.post(url, files=fields) print(res.request.body) print(res.request.headers) print(res.text)