我爲上游服務器(U)構建了反向代理(P)。一個客戶端應用程序(C)將向P發出一個請求,這個請求又會向U發出一個請求,並且由U返回的結果應該由代理P返回給客戶端C.Jersey 2 - 從資源方法返回客戶端響應
當我將代碼寫入P像這樣(我希望代理要儘可能通用,並支持多種結果類型):
Client client = // get the client
Invocation.Builder builder = // configure the call to U
return builder.get(InputStream.class);
它同時適用於JSON和二進制數據,返回結果,但Content-Type
頭總是設置到application/octet-stream
,這是錯誤的。我可以從U中檢查類型的結果並將其設置爲來自代理P的響應,但之後我必須處理錯誤處理等問題,而當我只是返回InputStream併發生錯誤時,方法builder.get()
拋出一個異常然後傳播給客戶端。
我真的想只是採取用U返回的響應,並把它作爲P的返回值,就像這樣:
Client client = // get the client
Invocation.Builder builder = // configure the call to U
return builder.get(); // returns Response
客戶端C,在我的情況一個Python 3 requests
應用,得到以下錯誤:
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
我嘗試下面的代碼:
Response upstreamResponse = client./* code code */.get();
upstreamResponse.bufferEntity();
return Response.fromResponse(upstreamResponse);
但是,唉,結果是一樣的。
我錯過了什麼?
這正是我的觀點 - 我不想這樣做,我只想做'返回updstreamResponse',它具有您提到的所有事情,而且我不需要做任何事情。 – wujek
我不認爲你會得到這個 - 代理是一個專門的用例。但我可以看到一個非常簡單的方法來複制你想要的。您甚至可以像許多代理一樣執行操作,並添加一個標頭來指示哪些IP,例如請求已轉發。但總的來說,我認爲你必須推出自己的產品。 – stdunbar
只需要注意一點 - 我不是寫一個完整的通用代理;我正在爲我非常專業的用例寫一個小工具。但是,我仍然不知道爲什麼我不能只是返回來自上游資源的任何內容,而是必須有一些東西,比如頭部或某物,這會破壞流。 – wujek