这个问题与@mario在以下链接上问的问题直接相关使用jax-rs(ResteAsy)作为中间件:将客户端的请求转到另一台服务器
我不明白为什么服务中的响应不能直接传达给客户端。考虑以下代码
postman(client)在下面的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()使用 proxy ,看起来像这样:
@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 将其回传递?有人可以给我原因吗?
javax.ws.rs.core.Response
是一个抽象类。从B接收数据的实现不会与将数据发送到A的相同。
Response
不是嵌入数据实体的对象实例。想想使用A的管道将数据从B传输到客户端A。A使用InputStream
从B中解开消息,获取实体并使用OutputStream