从JAX-RS GET服务返回二进制数据

时间:2019-07-11 07:40:19

标签: jersey jax-rs weblogic

我在Jersey实施了一个JAX-RS GET服务,并假设我希望它返回二进制数据,该怎么办?

以下服务是我写的。它已部署在WebLogic上。

@GET
@Path("Get")
public Response get() {
    try {
        byte[] bytes = Files.readAllBytes(Paths.get("F://test.gz"));
        Response.ResponseBuilder responseBuilder = Response.status(200);
        return responseBuilder
                .header("Transfer-Encoding", "chunked")
                .header("Content-Encoding", "gzip")
                .header("Content-Type", "application/json; charset=utf-8")
                .entity(bytes).build();
    } catch (IOException exception) {
        // this part is not executed
        throw new InternalServerErrorException(exception);
    } finally {
        // this part is executed
    }
}

我使用了SoapUI之类的客户端进行测试,等待了一段时间后,在SoapUI中收到了“ java.net.SocketException:套接字已关闭”的信息,但是我可以看到SoapUI中返回的响应标头包括状态代码200.数据非常小(小于1KB),服务中也没有例外。

编辑

请进一步说明一下,二进制数据的来源实际上是通过HttpURLConnection连接从另一个服务器X获得的。也就是说,上述Web服务应该是直通(代理)服务。它应该只使用HTTP调用服务器X中的另一个服务,然后将响应主体(文本或二进制)和所有响应标头返回给客户端。我发现服务器X返回二进制数据,它是421个字节(正是我在test.gz文件中所拥有的),并且具有以下标头

Transfer-Encoding = chunked
null = HTTP/1.1 200 OK
Cache-Control = max-age=3600, public
Content-Encoding = gzip
Vary = Accept-Encoding
Date = Thu, 11 Jul 2019 03:59:04 GMT
Content-Type = application/json; charset=utf-8

我应该只将二进制数据和这些标头返回给客户端。

我刚刚发现,如果不将“ Transfer-Encoding”返回给客户端,我的问题就会消失。这意味着我不能简单地将每个标头返回给客户端,而是要有选择性。

0 个答案:

没有答案