Django post请求遇Response is not valid 'application/json'错误排查
问题排查结论
核心错误原因
requests库的post方法json参数使用不符合规范:requests.post的json参数仅接受Python原生字典/列表等可序列化对象,库内部会自动完成JSON序列化操作,并自动添加Content-Type: application/json请求头。你提前将json_payload通过json.dumps序列化为字符串后再传入json参数,会导致requests对该字符串做二次序列化,最终发送的请求体是双重编码的JSON结构,服务端无法正常解析,因此返回Response is not valid 'application/json'错误。- 你手动复制打印的序列化后JSON去测试接口可以正常调用,刚好印证了这个结论:你复制的是第一次序列化后的正确JSON结构,而代码实际发出去的是二次序列化后的错误结构。
修复方案
修改你的post_request工具函数,去掉手动JSON序列化步骤,直接将Python字典传给json参数即可,修复后代码如下:
def post_request(url, json_payload, **kwargs): # 仅保留打印用的序列化逻辑,实际传参不需要提前序列化 print(f"{json.dumps(json_payload, indent=4)}") try: # 直接传json_payload字典给json参数,由requests完成序列化 response = requests.post(url, params=kwargs, json=json_payload) except Exception as e: print("Network exception occurred") print(f"Exception: {e}") # 异常场景下response未定义,补充返回逻辑避免后续访问报错 return print(f"With status {response.status_code}") print(f"Response: {response.text}")
附加校验点
可额外确认接口是否要求dealer_id放在URL查询参数中:当前你将dealer_id通过params参数传递,会自动拼接为URL的查询参数(形如?dealer_id=xxx),如果接口要求该参数放在请求体中,需要调整参数传递逻辑。
内容的提问来源于stack exchange,提问作者ASCIImo
相关产品推荐
相关产品推荐

