永发信息网

如何在requests post时不做urlencode

答案:2  悬赏:0  手机版
解决时间 2021-12-22 02:46
  • 提问者网友:夢醒日落
  • 2021-12-21 22:03
如何在requests post时不做urlencode
最佳答案
  • 五星知识达人网友:拜訪者
  • 2021-12-21 22:37
这两天要为公司一个项目的服务端写性能测试脚本,其中有一个请求订单号的接口,需要客户端用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)
全部回答
  • 1楼网友:詩光轨車
  • 2021-12-21 23:53
这两天要为公司一个项目的服务端写性能测试脚本,其中有一个请求订单号的接口,需要客户端用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了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯