我有一个原始的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可以包含任何原始数据
答案 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");
但老实说,我不确定警告的含义,以及任何安全隐患,所以你可以调查一下。