Postman POST请求正常,Python调用Java Spring接口返回400错误
问题解决:Python requests调用Spring接口返回400,JSON解析失败
核心原因
Spring报错明确指出:它接收到的不是预期的JSON对象,而是一个被当成字符串处理的JSON文本(比如请求体是"{\"key\":\"value\"}"而非{"key":"value"})。Postman正常是因为它正确发送了JSON格式的请求体并设置了Content-Type: application/json,而Python请求的构造逻辑存在问题。
解决方案
1. 确保请求头正确设置Content-Type
Spring依赖Content-Type头识别请求体格式,必须显式设置:
headers = {'Content-Type': 'application/json'}
2. 正确构造请求体(两种可选方式)
方式一:直接传递Python字典给json参数(推荐)
requests库的post方法提供json参数,会自动将字典序列化为JSON字符串,并自动设置Content-Type: application/json:
import requests # 构造请求体字典 payload = { "field1": "value1", "field2": 123 } response = requests.post( url="http://your-spring-api-url", json=payload # 直接传字典,无需手动序列化 )
方式二:手动序列化但避免额外嵌套字符串
如果必须用data参数,需用json.dumps()序列化字典,但不要给序列化后的字符串加额外引号,同时手动设置Content-Type:
import requests import json payload = { "field1": "value1", "field2": 123 } response = requests.post( url="http://your-spring-api-url", data=json.dumps(payload), # 正确序列化,返回纯JSON字符串 headers={'Content-Type': 'application/json'} )
3. 排查Java DTO的序列化配置(补充验证)
虽然你提到已有空构造和@JsonCreator注解,仍需确保字段映射正确:
- 如果用
@JsonCreator,全参构造器的每个参数必须添加@JsonProperty("字段名")对应JSON键:
public class StatsDto { private String field1; private Integer field2; public StatsDto() {} // 空构造器 @JsonCreator public StatsDto( @JsonProperty("field1") String field1, @JsonProperty("field2") Integer field2 ) { this.field1 = field1; this.field2 = field2; } // getter/setter }
- 更简单的方式是用Lombok的
@Data注解,自动生成空构造、getter/setter和toString,避免手动构造器的映射错误:
import lombok.Data; @Data public class StatsDto { private String field1; private Integer field2; }
错误写法示例(避免踩坑)
以下是导致问题的常见错误:
- 错误1:把JSON字符串当成普通字符串传递,导致Spring接收到带引号的文本:
# 错误:手动加了引号,请求体变成字符串而非JSON对象 payload = '{"field1":"value1","field2":123}' response = requests.post(url, data=payload) # 未设置Content-Type
- 错误2:用
str()转换字典而非json.dumps(),导致请求体是Python字典的字符串表示(比如"{'field1': 'value1'}"),格式完全不符合JSON规范。
内容的提问来源于stack exchange,提问作者arthurIsVibing
相关产品推荐
相关产品推荐

