我有一些带有一些数据的无尽InputStream
,我想在响应GET
HTTP请求时返回这些数据。我希望我的web / API客户端能够无休止地阅读它。如何使用JAX-RS进行操作?我正在尝试这个:
@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput stream() {
final InputStream input = // get it
return new StreamingOutput() {
@Override
public void write(OutputStream out) throws IOException {
while (true) {
out.write(input.read());
out.flush();
}
}
};
}
但客户端不会显示内容。但是,如果我添加OutputStream#close()
,服务器会在当时发送内容。我怎样才能让它真正流畅?
答案 0 :(得分:2)
所以,你有冲洗问题,你可以尝试获得规范所说的ServletResponse:
@Context注释可用于指示对a的依赖 Servlet定义的资源。基于Servlet的实现必须支持 注入以下Servlet定义的类型:ServletConfig, ServletContext,HttpServletRequest和HttpServletResponse。
注入的HttpServletResponse允许资源方法提交 返回前的HTTP响应。一个实现必须检查 已提交状态,仅在响应时处理返回值 尚未承诺。
然后冲洗你能做的一切,就像这样:
@Context
private HttpServletResponse context;
@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public String stream() {
final InputStream input = // get it
ServletOutputStream out = context.getOutputStream();
while (true) {
out.write(input.read());
out.flush();
context.flushBuffer();
}
return "";
}
答案 1 :(得分:0)
只是猜测:
@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public Response stream() {
final InputStream input = getit();
return Response.ok(input, MediaType.TEXT_PLAIN_TYPE).build();
}
答案 2 :(得分:0)
只需使用JAX-RS的StreamingOutput
@Path(“ / numbers”) 公共类NumbersResource {
@GET
public Response streamExample(){
StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream out) throws IOException, WebApplicationException {
Writer writer = new BufferedWriter(new OutputStreamWriter(out));
for (int i = 0; i < 10000000 ; i++){
writer.write(i + " ");
}
writer.flush();
}
};
return Response.ok(stream).build();
}
}