You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:10:20