Spring Boot下REST流式数据读取异常及测试方法咨询
问题分析与解决方案
一、调用代码的错误点
- 响应格式不匹配
主应用接口输出的是连续无分隔的JSON对象,而调用端用readLine()读取——该方法需要遇到换行符才会返回数据。但主应用代码仅写入JSON字符串,未添加换行,导致readLine()会一直阻塞,直到整个流结束才会读到完整数据。
- 修复方案:在主应用的写入逻辑中,每个JSON对象后添加换行符:
writer.write(objectMapper.writeValueAsString(trx)); writer.write("\n"); // 添加换行分隔符 writer.flush();
- HttpURLConnection缓冲问题
默认情况下,HttpURLConnection会缓冲整个响应,不会实时返回流式数据。需要禁用缓冲并开启分块传输:
- 添加配置代码:
connection.setChunkedStreamingMode(1024); // 启用分块传输,设置块大小 connection.setUseCaches(false); // 禁用缓存
- 请求输出流未关闭
调用端写完请求体(filter数据)后,未关闭输出流,主应用可能会一直等待请求体完整,无法触发响应发送。
- 修复方案:写完数据后关闭输出流:
OutputStream os = connection.getOutputStream(); os.write(objectMapper.writeValueAsBytes(filter)); os.flush(); os.close();
二、接口测试方法
Postman支持流式接口测试
创建POST请求,填写接口URL,设置Content-Type为application/json,在Body中填入TrxFilter的JSON内容。发送请求后,在响应面板切换至「Stream」模式(部分版本需在设置中开启流式响应显示),即可实时查看每一条返回的JSON数据。curl命令测试
使用-N参数禁用缓冲,实时输出响应内容:
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' -N http://.../repeng/getTransactions/{id}/{batchSize}
- 自定义测试程序
可使用Java 11+的HttpClient或OkHttp编写测试代码,这类库对流式响应的支持更友好,能实时处理每一块返回的数据。
内容的提问来源于stack exchange,提问作者Tomáš Pavlík
相关产品推荐
相关产品推荐

