如何在requests post时不做urlencode

百度网友ded4135
高粉答主

推荐于2016-04-28 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.7万
采纳率:87%
帮助的人:1.2亿
展开全部
这两天要为公司一个项目的服务端写性能测试脚本,其中有一个请求订单号的接口,需要客户端用post请求向服务端发送加密过的token 和订单数据。代码如下:

payload = {'token':token,'order_data':order_data}

r = requests.post(url, data=payload}

但是,服务端返回错误,花了很长时间检查了token和order_data的加密算法,确认没错;

查了下文档,上面有这样一句话:

There are many times that you want to send data that is not form-encoded. If you pass in a string instead of a dict , that data will be posted directly.

所以,只要直接传一个string作为payload数据,requests就不会做任何转换,直接发出去。

这样,代码就改为:

payload = "token="+token+"&order_data="+order_data

r = requests.post(url, data=payload}

但是,奇怪的是,服务端还是报错。

后来只好换用curl来发

cmd = 'curl -d \"token=' +token+'&json_data='+str_json+'\" '+url

os.system(cmd)

这样是成功的

那用requests到底错在什么地方呢?

用wireshark抓包发现:

用reqeusts和curl发送的数据都是一样的,但是,curl有带一个header:"Content-Type": "application/x-www-form-urlencoded"

看来requests也需要加上这个头:

headers = {"Content-Type": "application/x-www-form-urlencoded"}

r = requests.post(url, data=payload, headers=headers)

这样就OK了
就烦条0o
2018-07-06 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
这两天要为公司一个项目的服务端写性能测试脚本,其中有一个请求订单号的接口,需要客户端用post请求向服务端发送加密过的token 和订单数据。代码如下:
payload = {'token':token,'order_data':order_data}
r = requests.post(url, data=payload}
但是,服务端返回错误,花了很长时间检查了token和order_data的加密算法,确认没错;
查了下文档,上面有这样一句话:
There are many times that you want to send data that is not form-encoded. If you pass in a string instead of a dict, that data will be posted directly.
所以,只要直接传一个string作为payload数据,requests就不会做任何转换,直接发出去。
这样,代码就改为:
payload = "token="+token+"&order_data="+order_data
r = requests.post(url, data=payload}
但是,奇怪的是,服务端还是报错。
后来只好换用curl来发
cmd = 'curl -d \"token=' +token+'&json_data='+str_json+'\" '+url
os.system(cmd)
这样是成功的
那用requests到底错在什么地方呢?
用wireshark抓包发现:
用reqeusts和curl发送的数据都是一样的,但是,curl有带一个header:"Content-Type": "application/x-www-form-urlencoded"
看来requests也需要加上这个头:
headers = {"Content-Type": "application/x-www-form-urlencoded"}
r = requests.post(url, data=payload, headers=headers)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式