日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

webresource_Jersey WebResource –标头不附加

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webresource_Jersey WebResource –标头不附加 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

webresource

總結

以上是生活随笔為你收集整理的webresource_Jersey WebResource –标头不附加的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。