我正在使用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;
}
这是处理程序将其发送到reports-server ...
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
(复制并粘贴,看起来就像那样。我不知道为什么Postman会显示这些箭头!)
知道我在这里失踪的是什么吗?代理是否需要以某种方式解压缩从内部客户端收到的响应并在将其返回到原始客户端之前重新打包?请提出您需要的任何问题以便澄清。谢谢!
修改
等待!可能是我的Response有一个输入流,我需要读取它并写出并输出流到客户端 - 或类似的东西?
答案 0 :(得分:1)
您关闭了客户端,因此无法在开放客户端上下文中解包响应。打开您的回复,关闭客户端,然后返回未包装的对象。
编辑:
抱歉,不是您的客户。我相信你有一个close()方法的Response对象。
非常像这样:
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;