我正在尝试使用StreamingResponseBody
实现流HTTP API。我也有一个Filter
,它使用HttpServletRequest
和HttpServletResponse
包装ContentCachingRequestWrapper
和ContentCachingResponseWrapper
。
当我禁用过滤器时,它绝对可以正常工作。但是,启用过滤器后,我什么也没有得到响应。有时我会得到部分响应-特别是在API启动时。
此外,如果我不将HttpServletRequest
和HttpServletResponse
用ContentCachingRequestWrapper
和ContentCachingResponseWrapper
包裹起来,那行得通!
这是我的示例流API:
response.setContentType(MediaType.APPLICATION_STREAM_JSON_VALUE);
StreamingResponseBody stream = out -> {
ObjectMapper mapper = new ObjectMapper();
for(int i = 0; i < 100; i++) {
try {
Foo foo = Foo.builder().name("John").email("john@doe.com").build();
String fooS = mapper.writeValueAsString(foo);
out.write(fooS.getBytes());
out.flush();
TimeUnit.MILLISECONDS.sleep(50);
Bar bar = Bar.builder().desc("This is some random desc - " + i).build();
String barS = mapper.writeValueAsString(bar);
out.write(barS.getBytes());
out.flush();
}catch (IOException | InterruptedException e) {
LOGGER.error("[+] failed to stream data with error: {}", e.getMessage());
Thread.currentThread().interrupt();
}
}
};
return new ResponseEntity<>(stream, HttpStatus.OK);
这是我的过滤器实现:
long startTime = System.currentTimeMillis();
ContentCachingRequestWrapper request = new ContentCachingRequestWrapper(httpServletRequest);
ContentCachingResponseWrapper response = new ContentCachingResponseWrapper(httpServletResponse);
try {
filterChain.doFilter(request, response);
} finally {
//restInboundLogProcessor.log(startTime, request, response);
response.copyBodyToResponse();
}
我似乎无法弄清楚为什么我没有得到答复,或者很少得到部分答复。非常感谢!