使用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
相关产品推荐
相关产品推荐

