這個問題直接關係到這個問題通過以下鏈接通過@Mario問 Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another serverJAX-RS(RestEasy的)中間件:經紀客戶端請求
我不明白,爲什麼從服務的響應不能直接轉達回客戶端。請看下面的代碼
郵差(客戶端),使資源ServiceA GET請求的URI如下:
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調用REST方法show() using Proxy它看起來像這樣:
@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只是響應返回給客戶端,一切都很好。但客戶沒有收回任何東西。
當然我嘗試了上面鏈接中提到的解決方案。它的工作原理。
@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();
}
我不明白爲什麼?直接訪問ServiceB返回結果;使用ServiceA將其中繼嗎?有人能爲我提供理由嗎?
非常感謝您的明確解釋。它非常有意義。事實上,這也回答了我有一個客戶端(郵遞員)直接訪問資源** ServiceB **的相關問題,並按預期提供XML響應。查看**響應**參考,可以看出實體**員工**被序列化;在** ServiceA **代碼中,所收到的**響應**似乎不同。這是因爲您提到的** Response **的不同實現,因此在客戶端顯示爲空。我對麼? –
這兩種情況下的響應都是'application/xml',所以最終內容相同。如果您在對象中查看不同的序列化,原因可能是處理流的不同類實現 – pedrofb