gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:19:59 25 4
gpt4 key购买 nike

我有一个原始的 inputStreamHttpServletRequest我需要使用 JAX-RS 客户端将收到的整个 inputStream 以及 header 发送到另一个 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 可能包含任何原始数据

最佳答案

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

对于MediaType (和标题),我会注入(inject) @Context HttpHeaders进入你的资源类。它使查找特定标题变得更加容易。你可以做

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

您还可以在构建请求时遍历 header
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对于不同的请求,只要您在创建后不弄乱它的配置即可。

如果您像我在上面所做的那样遍历所有 header ,您将在日志中收到有关允许受限制 header 的警告。您可以使用系统属性禁用警告
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

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

关于jax-rs - 如何使用 JAX-RS 2.0 客户端 API 发布原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com