Jersey 2 - 从资源方法返回客户的响应

时间:2016-05-07 19:38:58

标签: java jax-rs jersey-2.0

我为上游服务器(U)构建了一个反向代理(P)。客户端应用程序(C)将向P发出请求,P将向U发出请求,U返回的结果应由代理P返回给客户端C.

当我像这样用P编写代码时(我希望代理尽可能通用,并支持多种结果类型):

Client client = // get the client
Invocation.Builder builder = // configure the call to U
return builder.get(InputStream.class);

它适用于JSON和二进制数据,返回结果,但Content-Type标头始终设置为application/octet-stream,这是错误的。我可以从U中检查类型的结果并将其设置为来自我的代理P的响应,但随后我将不得不处理错误处理等等。而当我只是返回InputStream并发生错误时,{{ 1}}方法抛出异常,然后传播到客户端。

我实际上只想接受U返回的Response并将其用作P的返回值,如下所示:

builder.get()

客户端C,在我的情况下是Python 3 Client client = // get the client Invocation.Builder builder = // configure the call to U return builder.get(); // returns Response 应用程序,得到以下错误:

requests

我尝试了以下代码:

requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

但是,唉,结果是一样的。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

我原本希望代理通过内容类型(也可能是内容长度和状态等)。所以看起来会更像:

Response upstreamResponse = client./* code code */.get();
upstreamResponse.bufferEntity();
return Response.status(upstreamResponse.status())
               .type(upstreamResponse.getMediaType()
                // and so on

实际上,您可能也可能不想要来自upstreamResponse标题的许多内容 - 例如Cookies怎么样?