问题
最近在写java的ODD + cucumber的框架,其中的接口调用相比python来说非常繁琐,很不友好,如下图
所以我打算先用python调一下这个接口,代码如下,url已做脱敏处理
import requests
url = "http://xxxxxxxxxxxxxxxxxxx:9660/api/data/odsc/hex"
headers = {
"accept":"*/*",
"Connection" : "keep-alive",
"Content-Type" : "application/json"
}
payload = {
"topic" : "m-100",
"vin": "ABCDEFGHIJKLMNOPQ",
"hexPayload" : "23 23 02 71 62 61 6A 66 67 79 34 6E 77 33 73 39 66 6F 31 34 06 01 00 76 17 04 19 0D 14"
" 08 00 05 02 17 04 19 0D 14 08 22 11 67 00 05 55 44 22 11 34 17 11 22 45 35 34 15 44 21 "
"45 02 67 48 36 01 06 D1 F5 D5 01 D0 C7 3B 00 00 00 00 20 D6 AE E8 BE 7F 46 FB 75 12 1E "
"2A 12 1E AC 10 4C 77 B8 84 D1 26 43 7E 46 3B A7 DB 6B 19 D9 C6 AC 20 91 BE DD D1 2D C2 80"
" EB 47 09 87 AA 3A C1 90 0D 03 EB AE 1F 66 F7 2A 3E F6 FF FE 85 46 01 42 A8 41"
}
r = requests.post(url,headers = headers, data = payload)
print(r.text)
print(r.headers)
返回结果400
总结
经过排查,发现是post中不应该用data = xxx 而已该使用json =, 改完后请求成功,可以正常访问
犯蠢了,太久没用了
request.传参,json = , data = 以及 params = 这三者的区别
首先,params只适用于get方法。
然后,data = 和 json = 的区别可以用一句话来概括:
json 和 data 传的都是json格式的数据,不过json = 传的值在python中是以字典形式存在的,而data = 传的值在python中是以string形式存在的。
将上面代码中的发送请求的代买改为如下:
r = requests.post(url,headers = headers, data= json.dumps(payload))
同样的效果
json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)
(1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)
(2)json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)