如何将requests库POST请求的response.request.body转换为字典?
如何将POST请求的body字符串转回字典(基于requests库)
当使用Python的requests库发送POST请求时,传入的data字典会被自动编码为application/x-www-form-urlencoded格式的字符串:
import requests response = requests.post("https://httpbin.org", data={"x": 100, "y": 200}) # 注:httpbin.org根路径不接受POST请求,返回405状态码,但不影响后续演示
通过response.request可以访问原始请求对象,进而获取编码后的请求body:
response.request.body # 输出结果:'x=100&y=200'
问题
如何将这个编码后的body字符串转回最初的字典格式,无需手动解析字符串,借助现成库函数实现?
解决方案
可以使用Python标准库urllib.parse中的parse_qs或parse_qsl函数,这两个函数专门用于解析URL编码的表单数据,不管是URL查询参数还是POST请求的body(只要是application/x-www-form-urlencoded格式)都适用。
示例代码
from urllib.parse import parse_qs, parse_qsl # 获取编码后的body字符串 body_str = response.request.body # 方法1:使用parse_qs,返回值为值是列表的字典 parsed_dict = parse_qs(body_str) print(parsed_dict) # 输出:{'x': ['100'], 'y': ['200']} # 若确定每个参数只有一个值,可转为普通字典 single_value_dict = {key: value[0] for key, value in parsed_dict.items()} print(single_value_dict) # 输出:{'x': '100', 'y': '200'} # 方法2:使用parse_qsl,返回键值对元组列表,再转为字典 parsed_list = parse_qsl(body_str) print(dict(parsed_list)) # 输出:{'x': '100', 'y': '200'}
补充说明
parse_qs会将每个参数的值存储为列表,这是因为HTTP表单允许同一参数名对应多个值(比如多选框场景),如果你的业务场景中每个参数仅对应一个值,用字典推导式转换即可。parse_qsl直接返回(key, value)格式的元组列表,转换为字典时会自动保留同一参数的最后一个值,适合参数唯一的场景。
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

