最近通过flask编写一个web程序,在通过requests模块对restful接口进行测试时,遇到了一个问题,在这里记录下。
关键词: post提交方式
1.问题描述
通过requests进行post提交数据时,后台无法获取到对应的参数。
tx = requests.post('XXXX',data={"a":"xx"})
1.1 后台报400错误。400错误表示 由于语法格式有误,服务器无法理解此请求。但后台的接口确实可以进行post请求。之后发现原因是当flask的request.form无法获取到对应的参数时,就会报400错误。
request.form['name'] # 如果无法获取name的值,报400错误
request.form.get('name',None) # 无法获取到name的值时不报错
1.2 将后台的request.form打印查看,确实没有获取到requests传来的数据。但通过ajax发送数据时,却可以获取到。通过谷歌浏览器工具查看ajax请求,发现post的提交方式是x-www-form-urlencoded,在requests中添加以下header。
Content-Type: application/x-www-form-urlencoded;charset=utf-8
但后台仍然无法获取参数。到这里明白,问题肯定出现在post的提交方式上,所以对post的提交方式进行进一步了解。(可参考四种常见的 POST 提交数据方式)
原来,x-www-form-urlencoded的数据格式类似于get方法,是“a=xx&b=xx”的结构,而不是json格式。将requests中data参数的值改为“a=xx&b=xx”的格式后,后台成功获取参数。
2.总结
这个问题其实很简单,但由于对http协议不熟,导致花了较多时间在这上面。所以对常见的网络协议还是要深入学习下。