Python如何将字典(dict)作为查询参数发起POST请求?
问题原因
- URL查询参数(对应requests的
params参数)、表单格式请求体(对应requests的data参数)都不支持直接传递嵌套字典类型,所有值都会被序列化为字符串,服务端收到的randomObject是字符串格式,不符合接口要求的对象类型,因此触发报错。 - 你原代码中将参数字典直接传给
requests.post的第二个位置参数,相当于提交表单格式数据,同样无法传递嵌套对象。
修复方案
方案1:使用JSON格式请求体(推荐,POST请求常用传参方式)
绝大多数POST接口都会要求参数放在JSON格式的请求体中,直接使用requests的json参数即可自动完成序列化,服务端可以正常识别嵌套对象类型。
import requests def do_random_request(self, random_dictionary: dict, random_number: int, random_name: str): url = "https://api.random-site.com/" payload = { "randomObject": random_dictionary, "randomNumber": random_number, "randomName": random_name, } try: # 使用json参数提交JSON格式请求体 response = requests.post(url, json=payload) response.raise_for_status() # 可额外捕获HTTP错误状态码 data = response.json() except Exception as e: print(e) else: return data
方案2:参数必须放在URL查询串时的处理
如果接口明确要求所有参数都放在URL查询串中,你需要先手动把字典序列化为JSON字符串,再传给params参数,同时需要确认服务端会对该字段做JSON解析。
import requests import json def do_random_request(self, random_dictionary: dict, random_number: int, random_name: str): url = "https://api.random-site.com/" params = { # 先把字典序列化为JSON字符串 "randomObject": json.dumps(random_dictionary), "randomNumber": random_number, "randomName": random_name, } try: response = requests.post(url, params=params) response.raise_for_status() data = response.json() except Exception as e: print(e) else: return data
内容的提问来源于stack exchange,提问作者tinom9
相关产品推荐
相关产品推荐

