2017-08-25 72 views
1

我有一个角度客户端正在对我的服务器进行POST调用。该服务器需要通过POST调用调用另一个服务器(server2)来获得响应,并将server2的响应传递给客户端。我尝试了以下方法。使用JAX-RS转发来自其他服务器的响应

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

但浏览器客户端最终使一个OPTIONS调用到server2Url而不是POST

和我试过了。

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

但是,这最终使GET调用,而不是一个POST。

如何让我的浏览器客户端进行POST调用到Server2

回答

0

你正在尝试完成覆盖在 RFC 2616我刚刚发现 here

如果接收响应302个的状态码比GET或HEAD以外的请求,用户代理不能自动重定向请求,除非它可以由用户来确认,因为这可能会改变的条件下,其该请求已发布。

因此,如果您不实施客户端,它看起来像是你的手。

编辑因为我被告知RFC 2616不能再使用了。

RFC 7231指出:

302实测值

的302(实测值)状态代码表示目标资源 下不同的URI临时驻留。由于重定向 有时可能会被更改,客户端应该继续使用有效的请求URI以用于将来的请求。

服务器应该在响应 中生成位置标题字段,其中包含不同URI的URI引用。用户代理MAY 使用位置字段值进行自动重定向。服务器的 响应有效负载通常包含一个短超文本注释,其中一个超链接指向不同的URI。

注意:由于历史原因,用户代理可能会将后续请求的请求 方法从POST更改为GET。 如果此 行为是不受欢迎的,则可以使用307(临时重定向)状态代码 代替

什么是:

307临时重定向

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

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

注意:此状态码与302(找到)类似,但它不允许将请求方法从POST更改为GET。这个 规范没有定义301的等效对象(永久移动 )([RFC7238]),但是,为此定义了状态码308 (永久重定向)。

0

您可以使用从JAX-RS Html Client使自己的请求(在Server1到Server2),然后返回从服务器2到角客户端的响应。

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(); 
} 
相关问题