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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:53:19