9

我有InputStream一些数据无穷无尽,我想返回这些数据以响应GETHTTP 请求。我希望我的 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(),服务器会在那个时候提供内容。我怎样才能使它真正可流式传输?

4

3 回答 3

2

因此,您有刷新问题,您可以尝试按照规范获取 ServletResponse:

@Context 注释可用于指示对 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 "";
}
于 2013-06-27T03:39:47.440 回答
2

只需使用 JAX-RS 的 StreamingOutput

@Path("/numbers")
public class 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();
    }
}
于 2020-08-26T21:23:10.503 回答
0

只是一个疯狂的猜测:

@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public Response stream() {
    final InputStream input = getit();
    return Response.ok(input, MediaType.TEXT_PLAIN_TYPE).build();        
}
于 2013-06-26T00:19:15.990 回答