如何使用JAX-RS 2.0客户端API发布原始数据

时间:2015-04-20 07:23:53

标签: jax-rs jersey-2.0 jersey-client

我有一个原始的inputStream和一个HttpServletRequest我需要使用JAX-RS客户端将收到的整个inputStream以及头文件发送到另一个servlet(原样)。

Client client = ClientBuilder.newClient();

WebTarget reTarget = client.target("http://localhost:8100/Server");
Invocation retargetInvocation = reTarget.request().??
Response.Response response = retargetInvocation.invoke();

我应该如何为帖子请求Invocation retargetInvocation = reTarget.request().post(Entity<T>)进行调用.inputStream可以包含任何原始数据

1 个答案:

答案 0 :(得分:8)

使用Entity.entity(inputStream, MediaType.YOUR_MEDIA_TYPE_TYPE)

对于MediaType(和标题),我会将@Context HttpHeaders注入您的资源类。它使查找特定标头更容易。你可以做到

Entity.entity(inputStream, httpHeaders.getMediaType());

您还可以在构建请求时遍历标题

Invocation.Builder builder = client.target(url).request();
for (String header: headers.getRequestHeaders().keySet()) {
    builder.header(header, headers.getHeaderString(header));
}
Response response = builder.post(Entity.entity(is, headers.getMediaType()));

总而言之,它可能看起来像

@Context HttpHeaders headers;

@POST
public Response doForward(InputStream is) {
    Client client = ClientBuilder.newClient();
    String url = "http://localhost:8080/...";
    Invocation.Builder builder = client.target(url).request();
    for (String header: headers.getRequestHeaders().keySet()) {
        builder.header(header, headers.getHeaderString(header));
    }
    Response response = builder.post(Entity.entity(is, headers.getMediaType()));
    return Response.ok(response.getEntity()).build();
}

请记住,Client是一个昂贵的对象。您可以为不同的请求重复使用相同的Client,只要您在创建后不会混淆配置。

如果你像上面那样迭代所有标题,你会在日志中收到有关允许受限标题的警告。您可以使用系统属性

禁用警告
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

但老实说,我不确定警告的含义,以及任何安全隐患,所以你可以调查一下。