【问题标题】:Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another server使用 JAX-RS (RESTEasy) 作为中间件:将客户端的请求代理到另一台服务器
【发布时间】:2023-03-10 11:11:01
【问题描述】:

我正在使用 JAX-RS (RESTEasy) 构建一个服务器,它将为客户端提供一个 REST 接口。服务器将充当客户端和另一台服务器之间的代理。另一台服务器,即第 3 方服务器 (JasperReports),也有一个 REST 接口。我想使用 JAX-RS 让我的代理与该服务器通信。 (我的代理服务器添加了身份验证和其他服务。)因此,您拥有三方:客户端、代理服务器、报告服务器。

我是这样看待工作流程的。代理服务器使用 JAX-RS(客户端)实现 JAX-RS(服务器)来获取客户端的请求,重新打包它们,然后将它们传递给报告服务器。当代理服务器获得报告后,我想将其转发回客户端。但是,到目前为止,我相信这就是问题所在。

这里有一些代码:

// Server gets a request and passes it to its (internal) client, handler.
@GET
@Path("/jobs")
public Response fetchAllScheduledJobs() {
    ReportScheduleHandler handler = new ReportScheduleHandler();
    Response response = handler.fetchAllScheduledJobs();
    return response;
}

这是将其发送到报告服务器的处理程序...

public Response fetchAllScheduledJobs() {
    Client client = ClientBuilder.newClient();

    client.register(getBasicAuthentication());
    Response response = 
        client.target(getReportsBaseUri())
            .request()
            .accept("application/json")
            .get();

    client.close();
    return response;
}

所以,在我(被误导的)想法中,我认为代理服务器只是将响应返回给客户端,一切都很好。但是,正如我上面所说,客户没有得到任何回报。我正在使用 REST 开发人员的客户端(“邮递员”),这是我要返回的标头:

Cache-Control →private
Content-Length →0
Content-Type →application/json
Date →Mon, 14 Jul 2014 16:05:46 GMT
Expires →Wed, 31 Dec 1969 19:00:00 EST
P3P →CP="ALL"
Server →Apache-Coyote/1.1
Transfer-Encoding →chunked

(复制粘贴,看起来就是这个样子。我不知道邮递员为什么会显示这些箭头!)

知道我在这里缺少什么吗?代理是否需要以某种方式解压缩从其内部客户端接收到的响应并重新打包,然后再将其返回给原始客户端?请提出您需要澄清的任何问题。谢谢!

编辑

等等!会不会是我的 Response 有一个输入流,我需要读取它并写出并输出流到客户端 - 或类似的东西?

【问题讨论】:

    标签: java jax-rs resteasy


    【解决方案1】:

    您正在关闭您的客户端,因此不会在打开的客户端上下文中展开响应。解开您的响应,关闭客户端,然后返回解开的对象。

    编辑:

    抱歉,不是您的客户。我相信 Response 对象你有一个 close() 方法。

    差不多是这样的:

    Client client = ClientFactory.newClient();
                WebTarget target = client.target("http://foo.com/resource");
                Response response = target.request().get();
                String value = response.readEntity(String.class);
                response.close();  // You should close connections!
    return value;
    

    【讨论】:

    • 我自己解决了这个问题,但我的关键见解是 response.readEntity(String.class) 位,您也在答案中提供了它。我将你的标记为答案。这很有趣,但我想我已经预料到“神奇的 API”会为我做所有事情 :)
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2023-04-01
    • 2015-05-16
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多