如何以application/x-www-form-urlencoded发送含列表的POST请求
问题
为了避免手动在网站添加汽车换油等保养记录,编写程序时遇到POST请求发送问题:
- 浏览器发送的请求
Content-Type为application/x-www-form-urlencoded,form data中的changed字段是JSON格式的列表 - 使用requests库的
data参数发送时,changed字段值被错误解析 - 使用
json参数则Content-Type变为application/json,不符合浏览器的请求类型 - 需要发送符合要求的请求,保持
changed字段值的双引号JSON格式
浏览器请求示例:
Accept:*/* Accept-Encoding:gzip, deflate, br Connection:keep-alive Content-Type:application/x-www-form-urlencoded Cookie: < coookies! > Host: Origin: Referer: Sec-Fetch-Dest:empty Sec-Fetch-Mode:cors Sec-Fetch-Site:same-origin Sec-Gpc:1 User-Agent:Chrome/118.0.0.0 Safari/537.36 Form data: bio: test car owner: OneMan changed:[{"changed":"oil","mil":127732}, {"changed":"breakpads","mil":126876}]
原测试代码:
import requests import json l = [{"changed":"oil","mil":127732}, {"changed":"breakpads","mil":126876}] datas = { 'owner': 'someowner', 'bio': 'bio', 'changed':l } r = requests.post('https://httpbin.org/post', data=datas) print(r.text)
当前输出中changed字段值异常,期望的form部分输出:
"form": { "bio": "bio", "changed": [{"changed":"oil","mil":127732}, {"changed":"breakpads","mil":126876}], "owner": "someowner" },
解决方案
直接将changed字段的列表手动序列化为JSON字符串,再放入data字典中发送即可,既能保持application/x-www-form-urlencoded的Content-Type,又能让changed字段以正确的JSON格式传递。
修正后的代码:
import requests import json l = [{"changed":"oil","mil":127732}, {"changed":"breakpads","mil":126876}] datas = { 'owner': 'someowner', 'bio': 'bio', # 将列表转为标准JSON字符串,保留双引号格式 'changed': json.dumps(l) } # requests使用data参数时默认Content-Type为application/x-www-form-urlencoded,无需额外设置 r = requests.post('https://httpbin.org/post', data=datas) print(r.text)
说明
- 原代码直接传入列表时,requests会自动将其拆分为多键值对格式(如
changed=oil&changed=breakpads),和浏览器发送的JSON字符串格式不符 json.dumps(l)将列表序列化为标准JSON字符串,作为普通字符串值传入data后,requests会按浏览器的form data格式传递该字段- 此时请求的
Content-Type保持为application/x-www-form-urlencoded,完全匹配浏览器的请求类型
内容的提问来源于stack exchange,提问作者Ownedds
相关产品推荐
相关产品推荐

