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

将其包装到客户端