使用REST流式传输数据

时间:2017-08-30 15:40:11

标签: java streaming swagger resteasy

将REST与RESTEasy和Swagger一起使用,有没有办法通过GET端点将数据流回调用者?我已经看过几个可以返回整个流的示例,但我还没有看到任何可以实际回传数据的示例。我也看过这个例子(从这个链接开始 - Return File From Resteasy Server)然而,这个例子看起来像是在返回一个流并期望调用者利用这个流?这是一个正确的假设吗?:

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/stream/test")
public Response getTestStream() {

    String myName = "name";
    InputStream stream = new ByteArrayInputStream(myName.getBytes(StandardCharsets.UTF_8));

    return Response.ok().entity(stream).build();
}

但这似乎对我不起作用。我得到一个异常:javax.ws.rs.NotAcceptableException:RESTEASY003635:接受标头不匹配。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您可以在Response中返回inputstream对象的对象。

例如

@GetMapping(value = "/stream/test")
@ResponseBody
public ResponseEntity<?> getTestStream() {

    String myName = "name";
    InputStream stream = new ByteArrayInputStream(myName.getBytes(StandardCharsets.UTF_8));

    HttpHeaders headers = new HttpHeaders();
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
    headers.add("Pragma", "no-cache");
    headers.add("Expires", "0");

    return ResponseEntity
            .ok()
            .headers(headers)
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(new InputStreamResource(stream));
}