此问题与@Mario在以下链接中提出的问题直接相关 Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another server
我不明白为什么服务的响应无法直接转发回客户端。请考虑以下代码
Postman(客户)在以下URI上对资源 ServiceA 发出GET请求:
http://localhost:8080/A/ServiceA
ServiceA 如下所示:
@Path("ServiceA")
public class ServiceA {
private static final String BASE_URI = "http://localhost:8080/B/";
// call ServiceB at localhost:8080/B/ServiceB
// <ServiceB> path is resolved via Proxy
@GET
@Formatted
@Produces({MediaType.APPLICATION_XML})
public Response show() {
ResteasyClient resteasyClient = new ResteasyClientBuilder().build();
ResteasyWebTarget webTarget = resteasyClient.target(BASE_URI);
ServiceBProxy serviceBProxy = webTarget.proxy(ServiceBProxy.class);
return serviceBProxy.show();
}
}
ServiceA 使用代理调用REST方法 show(),如下所示:
@Path("ServiceB")
public interface ServiceBProxy {
@GET
@Formatted
@Produces({ MediaType.APPLICATION_XML})
public Response show();
}
最后 ServiceB 看起来像这样:
@Path("ServiceB")
public class ServiceB {
@GET
@Formatted
@Produces({MediaType.APPLICATION_XML})
public Response show() {
return Response.status(200).entity(new Employee("John", "Doe", 32)).build();
}
我认为ServiceA只是将响应返回给客户端,一切都很顺利。但客户却什么都没有回来。
当然,我尝试过以上帖子中提到的解决方案。它有效。
@GET
@Formatted
@Produces({MediaType.APPLICATION_XML})
public Response show() {
ResteasyClient resteasyClient = new ResteasyClientBuilder().build();
ResteasyWebTarget webTarget = resteasyClient.target(BASE_URI);
ServiceBProxy serviceBProxy = webTarget.proxy(ServiceBProxy.class);
Response response = serviceBProxy.show()
Employee employee = response.readEntity(Employee.class);
response.close();
return Response.status(200).entity(employee).build();
}
我不明白为什么?直接访问 ServiceB 会返回结果;使用 ServiceA 重新发送回来不是吗?有人可以告诉我原因吗?
答案 0 :(得分:0)
javax.ws.rs.core.Response
是一个抽象类。从B接收数据的实现与将数据发送到A的实现相同。虽然接口是相同的,但它们不能互换
Response
不是嵌入了数据实体的对象实例。考虑通过A将数据从B传输到客户端的管道。使用{{1}}从B中解包消息,获取实体并使用InputStream