问题描述
在一次接口post测试请求传参异常的记录
print(header)
rp = requests.post(
EvnUrlConfig.getUrl(url),
headers=header,
data=userDevcieParam
)
传输到后台服务器报了异常
原因分析:
显而易见我的请求头的content-type类型有异常了,但我明明传的是application/json为什么给我转成了另外的格式呢?
requests 中 post 请求参数区别
在解释之前先提一下 httpbin.org 这个网站,这个网站的介绍是 A simple HTTP Request & Response Service. ,简单来说就是它是一个调试网站,可以通过网站返回的数据来了解我们发送给服务器的数据是怎么样的,服务器接收到了什么类型的数据,它的功能有很多,大家可以到它的官网多多了解下。
使用 requests 这个库可以通过不同的参数发送不同编码类型的数据,先看一段代码:
from pprint import pprint
import requests
url = 'http://httpbin.org/post'
data = {'a_test': 112233, 'b_test': 223344}
r = requests.post(url=url, data=data).json()
pprint(r)
url = 'http://httpbin.org/post'
data = {'a_test': 112233, 'b_test': 223344}
r = requests.post(url=url, json=data).json()
pprint(r)
我们使用同一个字典,使用 data 参数和 json 参数分别发送同样的数据,来对比数据是如何被处理的,以及被处理的结果。先看打印出来的返回值:
{'args': {},
'data': '',
'files': {},
'form': {'a_test': '112233', 'b_test': '223344'},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '27',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.24.0',
'X-Amzn-Trace-Id': 'Root=1-5f4869c6-b3834c881b400bc9b2877715'},
'json': None,
'origin': '125.36.92.42',
'url': 'http://httpbin.org/post'}
{'args': {},
'data': '{"a_test": 112233, "b_test": 223344}',
'files': {},
'form': {},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '36',
'Content-Type': 'application/json',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.24.0',
'X-Amzn-Trace-Id': 'Root=1-5f4869c6-a9b34c351c0adeed9669ac2a'},
'json': {'a_test': 112233, 'b_test': 223344},
'origin': '125.36.92.42',
'url': 'http://httpbin.org/post'}
通过上面数据可以看出,使用 data 参数时,发送的数据默认使用 application/x-www-form-urlencoded 编码方式进行处理
,然后发送了出去,证据就是我们发送的数据出现在了 form 表单字段中,而且 Content-Type 字段的值为 application/x-www-form-urlencoded,并且 json 字段的数据为 None
(因为它的服务端是用 python 写的,所以会出现 None)。
而使用 json 参数发送的数据,Content-Type 字段的值为 application/json,证明是通过 application/json 编码发送的数据,并且数据出现在了 json 字段中,证明服务端正常收到了 json 类型的数据并且可以正常处理。
参考链接:https://zhuanlan.zhihu.com/p/202978890?utm_id=0
解决方案:
将data改成json就可以了
rp = requests.post(
EvnUrlConfig.getUrl(url),
headers=header,
json=userDevcieParam
)