使用JAX-RS转发来自其他服务器的响应

时间:2017-08-25 23:41:14

标签: rest http jax-rs

我有一个角度客户端正在对我的服务器进行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调用

2 个答案:

答案 0 :(得分:0)

我刚刚找到的RFC 2616 here涵盖了您要完成的任务。

  

如果收到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(Found)类似,但除外   不允许将请求方法从POST更改为GET 。这个   规范没有定义301的等效对应物(移动   然而,([RFC7238])定义状态代码308   (永久重定向)为此目的)。

答案 1 :(得分:0)

您可以使用JAX-RS中的Html Client发出自己的请求(从server1到server2),然后将响应从server2返回到角客户端。

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();
}