我在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”返回给客户端,我的问题就会消失。这意味着我不能简单地将每个标头返回给客户端,而是要有选择性。