JAX-RS (RestEasy) 中间件:代理客户端请求
JAX-RS (RestEasy) middleware: brokering client request
这个问题与@Mario 在下面link 提出的问题直接相关
Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another server
我不明白为什么服务的响应不能直接中继回客户端。考虑以下代码
邮递员(客户端)在以下 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 使用 Proxy 调用 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 只是 returns 返回给客户端的响应,一切正常。但是客户什么也得不到。
当然,我尝试了上面 post link 中提到的解决方案。并且有效。
@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();
}
我不明白为什么?直接访问ServiceBreturns返回结果;使用 ServiceA 将它中继回来不是吗?有人可以告诉我原因吗?
javax.ws.rs.core.Response
是一个摘要 class。从B接收数据的实现和向A发送数据的实现是不一样的,虽然接口一样,但是不能互换
Response
不是嵌入了数据实体的对象实例。想象一个通过 A 将数据从 B 传输到客户端的管道。A 使用 InputStream
解包来自 B 的消息,获取实体并使用 OutputStream
将其包装到客户端
这个问题与@Mario 在下面link 提出的问题直接相关 Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another server
我不明白为什么服务的响应不能直接中继回客户端。考虑以下代码
邮递员(客户端)在以下 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 使用 Proxy 调用 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 只是 returns 返回给客户端的响应,一切正常。但是客户什么也得不到。
当然,我尝试了上面 post link 中提到的解决方案。并且有效。
@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();
}
我不明白为什么?直接访问ServiceBreturns返回结果;使用 ServiceA 将它中继回来不是吗?有人可以告诉我原因吗?
javax.ws.rs.core.Response
是一个摘要 class。从B接收数据的实现和向A发送数据的实现是不一样的,虽然接口一样,但是不能互换
Response
不是嵌入了数据实体的对象实例。想象一个通过 A 将数据从 B 传输到客户端的管道。A 使用 InputStream
解包来自 B 的消息,获取实体并使用 OutputStream