2017-08-25 78 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(); 
} 
相關問題