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

使用RestTemplate发送POST请求遇400错误:大JSON数据传输问题

解决RestTemplate发送超大JSON POST请求报400 Bad Request的问题

我之前也碰到过类似的超大JSON用RestTemplate发POST报400的情况,结合你的AllCars代码来看,大概率是这几个原因导致的,咱们一步步排查和解决:

1. 请求体大小超出RestTemplate默认限制

RestTemplate底层的请求工厂和消息转换器默认对请求体大小有上限,当你的JSON数据过大时,会被截断或者直接拒绝,触发400错误。

解决方法:配置支持大请求体的RestTemplate
你可以替换默认的请求工厂为HttpComponentsClientHttpRequestFactory,同时调整消息转换器的写入大小限制:

// 初始化支持大连接的HttpClient
HttpClient httpClient = HttpClientBuilder.create()
        .setMaxConnTotal(100) // 最大总连接数
        .setMaxConnPerRoute(50) // 每个路由的最大连接数
        .build();

// 创建请求工厂并绑定HttpClient
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(5000); // 连接超时
requestFactory.setReadTimeout(10000); // 读取超时

// 初始化RestTemplate
RestTemplate restTemplate = new RestTemplate(requestFactory);

// 配置Jackson消息转换器,支持大JSON写入
MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
jacksonConverter.setObjectMapper(new ObjectMapper());
jacksonConverter.setMaxWriteSize(20 * 1024 * 1024); // 设置最大写入大小为20MB,根据你的需求调整
restTemplate.getMessageConverters().add(0, jacksonConverter);

2. JSON序列化/字段匹配问题

如果你的AllCars或Cars类的字段和服务器端期望的不匹配,或者序列化过程中出现错误,服务器无法解析请求体也会返回400。

解决方法:确保序列化正确性

  • 检查字段名是否和服务器端一致,比如服务器端期望的是驼峰命名的listCars,而你的字段是listcars,可以用@JsonProperty指定:
public class AllCars {
    @JsonProperty("listCars") // 匹配服务器端的字段名
    private List<Cars> listcars;
    
    // 构造器、getter、setter保持不变
}
  • 确保Cars类的所有需要序列化的字段都有getter方法,或者通过@JsonAutoDetect配置自动检测字段:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Cars {
    // 你的字段和方法
}

3. 未正确设置请求头

发送JSON请求时,如果没有指定Content-Type: application/json,服务器无法识别请求体格式,会返回400。

解决方法:发送请求时携带正确的请求头

// 构建请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

// 包装请求体和头
AllCars allCars = new AllCars(yourCarList);
HttpEntity<AllCars> requestEntity = new HttpEntity<>(allCars, headers);

// 发送请求
try {
    String response = restTemplate.postForObject(yourServerUrl, requestEntity, String.class);
    // 处理响应
} catch (HttpClientErrorException e) {
    // 可以打印详细错误信息,帮助排查
    System.out.println("错误状态码:" + e.getStatusCode());
    System.out.println("错误响应体:" + e.getResponseBodyAsString());
}

4. 服务器端的请求大小限制

如果以上配置都没问题,那可能是服务器端本身限制了请求体大小(比如Spring Boot项目的server.max-http-request-size参数),需要调整服务器端的配置来支持大请求。


内容的提问来源于stack exchange,提问作者Jemila_RIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:31:41