2020年9月18日 06:48 by wst
web开发一直使用sanic和requests,这个两个工具分属于不同的领域:一个用于服务端写接口,一个用于发请求抓取数据。
由于接口包含签名认证,无法直接用postman进行测试(也许有方法,知道的请赐教)。故使用requests的进行测试。
在使用过程中有如下疑问:
在requests中,可携带请求参数的有如下三个参数(详情见这里):
a. data -- 可选参数,类型为字典、元组列表、字节串、文件类型的对象;
b. json -- 一个可json化的python对象,将放在请求的body中传送;
c. params -- 可选参数,类型为字典、元组列表、字节串;
1. 这三种方式都有什么区别呢?
2. 服务端是怎么接收这些参数的呢?
下面通过实验验证下:
if __name__ == '__main__':
import time
param = {
"start_time": "2020-05-19",
"end_time": "2020-05-28",
"union_position_id": ["500907909434639544", "502009057153060303", "80872093216", "80870324108"],
"channel_id": ["20084", "32004", "3002"]
}
timestamp = now_timestamp()
sign = gen_post_sign(json.dumps(param), timestamp)
header = {
"timestamp": str(timestamp),
"token": sign
}
t1 = time.time()
resp = requests.post("http://xxxxxx.cn/yyyyyy/union/manage",
json=param, headers=header)
t = now_timestamp(unit="ms")
print(t)
print(resp.status_code)
if resp.status_code == 200:
d = resp.json()
print(d)
第20行的代码中参数名分别换成json/data/params, 得出的结论如下:
json传参:
request.json:{'start_time': '2020-09-16', 'end_time': '2020-09-17', 'union_position_id': ['80872093216', '80873204095'], 'channel_id': ['20084', '20034']},
request.body:b'{"start_time": "2020-09-16", "end_time": "2020-09-17", "union_position_id": ["80872093216", "80873204095"], "channel_id": ["20084", "20034"]}'
data传参:
request.body:b'start_time=2020-09-16&end_time=2020-09-17&union_position_id=80872093216&union_position_id=80873024095&channel_id=20084&channel_id=20034'
request.json:json parse error;
params传参:
request.body: b''
request.json: None
1. json传参比较靠谱,且各种语言都有实现;
2. data是传统的传参方式,也比较常用,只是有些数据json load错误;
3. params中的参数是编码到url里的,所以服务端body为空;