【问题标题】:Forwarding a response from another server using JAX-RS使用 JAX-RS 转发来自另一台服务器的响应
【发布时间】:2017-08-25 23:41:14
【问题描述】:

我有一个 Angular 客户端,它正在对我的服务器进行 POST 调用。该服务器需要通过使用 POST 调用调用另一个服务器(server2)来获得响应,并将响应从 server2 传递给客户端。我尝试了以下方法。

public Response call(){
   String server2Url = "http://server2/path"
   RestClient restClient = new RestClient();
   return Response.fromResponse(restClient.post(server2Url)).build();
}

但在上述情况下,传输的是 HTTP 状态代码,而不是响应正文。响应正文为空

然后我尝试了:

public Response call() throws URISyntaxException{
   String server2Url = "http://server2/path"
   RestClient restClient = new RestClient();
   return Response.temporaryRedirect(new URI(server2Url)).build();
}

但浏览器客户端最终对 server2Url 进行了 OPTIONS 调用,而不是 POST

我试过了。

public Response call() throws URISyntaxException{
    String server2Url = "http://server2/path"
    RestClient restClient = new RestClient();
    return Response.seeOther(new URI(server2Url)).build();
}

但这最终会进行 GET 调用而不是 POST。

如何让浏览器客户端对 server2 进行 POST 调用

【问题讨论】:

    标签: rest http jax-rs


    【解决方案1】:

    您可以使用 JAX-RS 中的 Html Client 发出自己的请求(从服务器 1 到服务器 2),然后将服务器 2 的响应返回给 angular 客户端。

    public Response call() {
        String url = "server2 url";
        Response response;
        try {
            response = ClientBuilder
                    .newClient()
                    .target(url)
                    .request()
                    .post(Entity.json(null), Response.class);
    
        }
        catch (Exception e) {
            // Whatever you want
            return null; // or error
        }
    
        // Return the status returned by server 2
        return Response.status(response.getStatus()).build();
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚找到hereRFC 2616 涵盖了您要完成的工作。

      如果收到 302 状态代码以响应 GET 或 HEAD 以外的请求,用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变请求被执行的条件发布。

      因此,如果您不实施客户端,这似乎是您无法控制的。

      编辑,因为有人告诉我不能再使用 RFC 2616。

      RFC 7231 声明:

      302 找到

      302(Found)状态码表示目标资源 临时驻留在不同的 URI 下。由于重定向 有时可能会更改,客户应继续使用 未来请求的有效请求 URI。

      服务器应该在响应中生成一个 Location 头域 包含不同 URI 的 URI 引用。用户代理可以 使用位置字段值进行自动重定向。服务器的 响应负载通常包含一个简短的超文本注释 指向不同 URI 的超链接。

      注意:由于历史原因,用户代理可能会更改请求 从 POST 到 GET 的方法用于后续请求。 如果这样 行为是不希望的,307(临时重定向)状态代码 可以改用

      什么是:

      307 临时重定向

      307(临时重定向)状态码表示目标 资源临时驻留在不同的 URI 和用户代理下 如果请求方法执行自动
      ,则不得更改请求方法 重定向到该 URI。由于重定向会随着时间而改变, 客户端应该继续使用原来的有效请求 URI 用于将来的请求。

      服务器应该在响应中生成一个 Location 头域 包含不同 URI 的 URI 引用。用户代理可以 使用位置字段值进行自动重定向。服务器的 响应负载通常包含一个带有
      的简短超文本注释 指向不同 URI 的超链接。

      注意:此状态码类似于 302(已找到),除了 它 不允许将请求方法从 POST 更改为 GET。这 规范没有定义 301 的等效对应物(移动 永久)(然而,[RFC7238] 定义了状态码 308 (永久重定向)用于此目的)。

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        相关资源
        最近更新 更多