Spring Boot使用RestTemplate调用POST接口时遇Response too large异常求助
解决RestTemplate POST请求「Response too large」(413)错误
一、错误原因分析
从返回的错误信息可以明确:
{"errors":[{"message":"Response too large","extensions":{"code":"413","responseSizeKb":1901.147,"responseSizeMaxKb":1000}}]}
请求得到的响应大小(1901KB)超出了允许的上限(1000KB),问题分为两种场景:
- 本地RestTemplate限制:你的RestTemplate配置了最大响应接收阈值,超出后触发报错;
- 目标服务器限制:对方服务设置了返回内容的大小上限,你的请求触发了该限制。
二、调整本地RestTemplate的接收限制
默认RestTemplate无强制响应大小限制,但如果用了自定义工厂配置,需调整参数:
1. 基于SimpleClientHttpRequestFactory配置
这是RestTemplate的默认实现,可通过以下方式修改缓冲区大小:
@Bean public RestTemplate restTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 禁用请求体缓冲(若请求体也较大) factory.setBufferRequestBody(false); // 延长读取超时,避免大响应加载超时 factory.setReadTimeout(10000); // 设置JDK HttpURLConnection的最大响应大小(单位:字节,示例为2MB) System.setProperty("sun.net.http.maxResponseSize", String.valueOf(2 * 1024 * 1024)); return new RestTemplate(factory); }
2. 基于HttpComponentsClientHttpRequestFactory(推荐)
用Apache HttpClient作为底层客户端,配置更灵活:
@Bean public RestTemplate restTemplate() { CloseableHttpClient httpClient = HttpClientBuilder.create() .setDefaultRequestConfig(RequestConfig.custom() .setSocketTimeout(10000) .setConnectTimeout(5000) .build()) .build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); // 禁用响应缓冲,流式处理大响应避免内存溢出 factory.setBufferRequestBody(false); return new RestTemplate(factory); }
注意:大响应不建议直接接收为
String.class,改用InputStream.class流式处理:ResponseEntity<InputStream> response = restTemplate.exchange(url, HttpMethod.POST, this.getHttpEntity(), InputStream.class); // 后续通过输入流逐步读取内容
三、处理目标服务器的响应大小限制
若错误由对方服务返回,可通过以下方式解决:
- 联系服务提供方,请求调整响应大小上限;
- 优化请求逻辑:
- 精简返回字段:通过请求参数指定仅返回所需字段,减少冗余数据;
- 分页获取:将单次大请求拆分为多次分页请求,每次获取部分数据;
- 启用响应压缩:在请求头中添加压缩标识,减小传输体积:
headers.add(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate");
无效操作说明
你尝试添加Content-Length头无效果,因为该头用于指定请求体的大小,而当前问题是响应大小超出限制,此配置与问题无关。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

