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

如何解决OkHttp3发送长XML请求时的StreamResetException问题

OkHttp3发送大XML文件遇StreamResetException的解决方法

发送包含数千行的大XML文件时出现StreamResetException: stream was reset: NO_ERROR,短文件可正常发送,可从以下几个方向排查解决:

1. 延长写入超时时间

当前设置的写入超时为30秒,大文件上传耗时可能超过这个阈值,导致连接被重置。调整超时参数:

private OkHttpClient getHttpClient() {
    if (httpClient == null) {
        httpClient = new OkHttpClient.Builder()
            .callTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS) // 延长写入超时至60秒,可根据实际情况调整
            .build();
    }
    return httpClient;
}

2. 强制使用HTTP/1.1协议

部分服务器对HTTP/2的大流量处理存在兼容性问题,禁用HTTP/2强制使用HTTP/1.1:

import okhttp3.Protocol;
import java.util.Arrays;

private OkHttpClient getHttpClient() {
    if (httpClient == null) {
        httpClient = new OkHttpClient.Builder()
            .callTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .protocols(Arrays.asList(Protocol.HTTP_1_1)) // 仅启用HTTP/1.1
            .build();
    }
    return httpClient;
}

3. 流式发送请求体,避免内存加载整份XML

直接将XML字符串传入RequestBody.create会把整个文件加载到内存,大文件改用流式读取(比如从文件直接构建请求体),减少内存占用同时优化发送效率:

File xmlFile = new File("你的大XML文件路径");
RequestBody requestBody = RequestBody.create(xmlFile, MediaType.get(APPLICATION_XML));

Request request = new Request.Builder()
    .url(url)
    .addHeader(SENDER, Sender)
    .addHeader(NACHRICHTUUID, Uuid)
    .addHeader(SCHEMEAGENCYID, SchemeId)
    .addHeader(AUTHORIZATION, token)
    .post(requestBody)
    .build();

如果XML是动态生成的,可自定义RequestBody实现流式写入:

RequestBody requestBody = new RequestBody() {
    @Override
    public MediaType contentType() {
        return MediaType.get(APPLICATION_XML);
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        // 示例:从输入流读取XML内容并流式写入
        try (InputStream xmlInputStream = new FileInputStream("你的大XML文件路径")) {
            sink.writeAll(Okio.source(xmlInputStream));
        }
    }
};

4. 排查服务器端限制

确认服务器是否存在请求大小限制(如Nginx的client_max_body_size)、请求超时设置,这些限制可能导致服务器提前关闭连接,触发流重置。

内容的提问来源于stack exchange,提问作者GörmenProgrämmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:44:59