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

问题:仅取消页面加载后才可读取HTTP请求体,需实现无需取消即可读取

问题分析

当前readBody方法通过循环读取每行内容,仅当找到长度等于传入参数length的行时才终止循环。但HTTP请求体是基于字节流传输的,并非强制按行分隔;且readLine()会一直阻塞等待换行符,直到连接被关闭(比如用户取消页面加载)才会返回剩余内容或null,这就是必须取消页面加载才能完成读取的核心原因。

修复方案

改为直接读取指定长度的字节内容,而非按行匹配长度。修改后的代码如下:

private String readBody(int length) throws Exception {
    debug("COMENSANT LLEGIR BODY");
    byte[] buffer = new byte[length];
    int bytesRead;
    int totalRead = 0;
    
    // 循环读取直到获取到指定长度的内容
    while (totalRead < length && (bytesRead = inputStream.read(buffer, totalRead, length - totalRead)) != -1) {
        totalRead += bytesRead;
        debug("已读取字节数: " + totalRead);
    }
    
    // 按请求指定编码转换为字符串(示例用UTF-8,需和请求Content-Type编码一致)
    String body = new String(buffer, 0, totalRead, StandardCharsets.UTF_8);
    debug("ACABANT LLEGIR BODY");
    debug("读取到的请求体: " + body);
    return body;
}
关键修改点
  • 移除按行读取的逻辑,直接操作字节流,确保精准读取指定长度的请求体内容
  • 使用InputStream.read()的重载方法,控制每次读取的字节范围,避免无意义阻塞
  • 显式指定字符编码,避免乱码问题,编码需与请求头Content-Type中声明的保持一致
额外注意事项
  • 确保传入的length参数与HTTP请求头Content-Length的数值完全一致,否则会出现读取不全或持续阻塞的情况
  • 如果请求采用分块编码(Transfer-Encoding: chunked),则不能用固定长度读取,需额外处理分块解码逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:06