Python requests设置请求头后POST请求返回400错误如何解决
问题根因
你手动设置请求头Content-Type: application/json时,传给requests.post()的data参数是原生Python字典,requests默认会将字典按application/x-www-form-urlencoded表单格式编码传输,不会自动转成JSON格式。服务端收到请求后,根据你声明的Content-Type尝试按JSON格式解析请求体,发现实际内容格式不匹配,解析失败就会返回400 Bad Request。
当你传入空请求头时,requests会自动根据传入的参数类型匹配对应的Content-Type:传字典给data参数时,会自动将Content-Type设为application/x-www-form-urlencoded,请求头和实际请求体格式一致,服务端可以正常解析,所以请求能成功。
修复方案
两种写法二选一即可,优先推荐第一种更简洁:
- 发送JSON格式请求时,直接使用
json参数传字典,不需要手动设置Content-Type请求头。requests会自动完成字典到JSON字符串的序列化,同时自动加上正确的Content-Type: application/json请求头。
import requests API_ENDPOINT = "https://reqres.in/api/users" data = {"name": "Name1", "job": "job1"} full_output = requests.post(url=API_ENDPOINT, json=data) print("response status", full_output.status_code) print("response", full_output.text)
- 如果确实需要手动设置JSON相关的Content-Type请求头,需要先手动将Python字典序列化为JSON字符串,再传给
data参数,保证格式和声明的Content-Type匹配。
import requests import json API_ENDPOINT = "https://reqres.in/api/users" data = {"name": "Name1", "job": "job1"} headers = {'Content-Type': 'application/json'} full_output = requests.post(url=API_ENDPOINT, headers=headers, data=json.dumps(data)) print("response status", full_output.status_code) print("response", full_output.text)
日常使用requests发送POST请求时,非特殊定制场景不需要手动设置Content-Type请求头:
- 发送普通表单数据:将字典传给
data参数即可,requests自动处理编码和请求头- 发送JSON数据:将字典传给
json参数即可,requests自动完成序列化和请求头配置
手动硬写Content-Type很容易出现请求头声明格式和实际请求体格式不匹配的问题,就是触发本次400错误的核心原因。
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

