Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAX-RS(RESTEasy)作为中间件:代理客户端';s对另一台服务器的请求_Java_Jax Rs_Resteasy - Fatal编程技术网

Java 使用JAX-RS(RESTEasy)作为中间件:代理客户端';s对另一台服务器的请求

Java 使用JAX-RS(RESTEasy)作为中间件:代理客户端';s对另一台服务器的请求,java,jax-rs,resteasy,Java,Jax Rs,Resteasy,我正在使用JAX-RS(RESTEasy)构建一个服务器,它将为客户端提供一个REST接口。服务器将充当客户机和另一台服务器之间的代理。另一个服务器是第三方服务器(JasperReports),也有一个REST接口。我想使用JAX-RS让我的代理与该服务器对话。(我的代理服务器添加了身份验证和其他服务。)因此,这里有三方:客户端、代理服务器和报表服务器 我这样看待工作流程。代理服务器实现JAX-RS(服务器)来获取客户机的请求,重新打包它们,并使用JAX-RS(客户机)将它们传递给报表服务器。当

我正在使用JAX-RS(RESTEasy)构建一个服务器,它将为客户端提供一个REST接口。服务器将充当客户机和另一台服务器之间的代理。另一个服务器是第三方服务器(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开发人员的客户端(“Postman”),下面是我得到的标题:

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
(复制粘贴,看起来就是这样。我不知道邮递员为什么会显示这些箭头!)

你知道我错过了什么吗?代理是否需要以某种方式解包从其内部客户端收到的响应,并在将其返回到原始客户端之前重新打包?请提出任何需要澄清的问题。谢谢

编辑


等等!可能是我的响应有一个输入流,我需要读取该流并将其写出并输出到客户端——或者类似的情况吗?

您正在关闭客户端,因此没有在开放的客户端上下文中展开响应。展开响应,关闭客户端,然后返回展开的对象

编辑:

对不起,不是你的客户。我相信响应对象中有一个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”能为我做一切:)