Jersey WebResource –标头不附加
昨天我在使用Jersey WebResource類進行HTTP調用時遇到了一個奇怪的問題:似乎我設置的標頭在執行HTTP調用時被忽略了。 提前閱讀。
我試圖實現的目標是調用REST Api從我們的應用程序中獲取一些數據。 為此,我使用了Jersey客戶端 ,顯然,我還必須轉發接收到的授權令牌,以便在目標應用程序上對用戶進行身份驗證。 不了解詳細的Jersey Api,我做了以下事情(不完全是,但根據本文內容進行了說明):
WebResource resource = Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data"); resource.accept(MediaType.APPLICATION_JSON); resource.type(MediaType.APPLICATION_JSON); resource.header(HttpHeaders.AUTHORIZATION, "Negotiate " + token);return resource.get(String.class);但是, Negotiate令牌沒有附加,至少在我收到“ 401授權被拒絕”響應時,我明確注意到了這一點。 在我的Apache上記錄HTTP請求進一步強調了我的假設。
作為嘗試,我將代碼稍微重寫為以下內容
return Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data").accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).header(HttpHeaders.AUTHORIZATION, "Negotiate " + token).get(String.class);..嘿,它成功了! WTF? 這到底是怎么回事
建造者模式
最初看起來很瘋狂,但是當您看看如何在com.sun.jersey.api.client.WebResource類上實現accept(...)時,這將變得更加清晰:
... @Override public Builder accept(String... types) {return getRequestBuilder().accept(types); } ...每次您都會獲得一個新的Builder對象! 這就是為什么它不起作用。 因此,您不必像上面的錯誤版本那樣編寫它:
WebResource resource = Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data");WebResource.Builder builder = resource.accept(MediaType.APPLICATION_JSON); builder.type(MediaType.APPLICATION_JSON); builder.header(HttpHeaders.AUTHORIZATION, "Negotiate " + token);return builder.get(String.class);注意,第一個調用resource.accept()返回Builder對象,隨后對type()和header()任何調用都直接在該Builder實例上進行。
您甚至可以反轉調用順序,例如先調用resource.type(..) ,然后accept等等。 為什么? 因為WebResource.Builder和WebResource本身都實現相同的接口RequestBuilder ,只是WebResource的實現創建了一個新的Builder對象,而Builder的實現實際上將傳遞的信息添加到了元數據集合中。
結論
Builder模式是通過隱藏實現細節(尤其是在Java中)來簡化對象實例創建的一種通用方法。 通常,您調用一系列向您的對象添加信息的方法,以最終調用build()方法,該方法返回所需的實例。 WebResource類完全隱藏了這一點。 現在,由于已經很長時間沒有使用Java進行編碼了,所以我不確定WebResource實現Builder模式的方式是否是常見的方式,但是我發現它會分心,并且可能導致討厭的錯誤。 至少,我花了幾個小時才能弄清楚為什么我的身份驗證方案不起作用。
翻譯自: https://www.javacodegeeks.com/2015/05/jersey-webresource-header-dont-get-appended.html
總結
以上是生活随笔為你收集整理的Jersey WebResource –标头不附加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate Collection
- 下一篇: 光明大陆死灵骑士符文怎么加(光明骑士怎么