问题:仅取消页面加载后才可读取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
相关产品推荐
相关产品推荐

