本文介紹了在JAX-RS中轉義查詢參數中的`%‘符號的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我嘗試使用Jersey或RESTEasy中的任何一個發送GET請求,并將某個URL字符串作為參數
Response response = new ResteasyClientBuilder()
.build()
.target(UriBuilder.fromPath("https://foo.bar"))
.queryParam("url", "http://hostname.com/The%20URL%20with spaces.jpg")
.request()
.get();
兩種實現都發送
https://foo.bar?url=http%3A%2F%2Fhostname.com%2FThe%20URL%20with%20spaces.jpg
我假設在查詢參數中使用%20
對原始空格進行轉義,并對原始%20
進行雙重轉義。
但事實并非如此。
原始空格和%20
混合在一起,在服務器端,我得到未轉義的字符串,所有%20
都轉換為空格,字符串被打斷。
根據source code of Resteasy,它”保持編碼值”%…”和模板參數不變”。但我在JEE文檔中沒有找到任何關于這種行為的詞。
是否應在將字符串添加為參數之前對其進行轉義?
我應該使用什么轉義程序來確保它轉義了"%..." and template parameters
的所有內容,并且它在參數中轉義的所有內容都被服務器成功地取消轉義?
JAX
標準推薦答案-RSWebTarget
的解決方案是不直接應用參數,而是將它們作為模板參數應用。
Response response = new ResteasyClientBuilder()
.build()
.target(UriBuilder.fromPath("https://foo.bar"))
.queryParam("url", "{urlTemplate}")
.resolveTemplate("urlTemplate", "http://hostname.com/The%20URL%20with spaces.jpg")
.request()
.get();
首先,我們添加一些模板{urlTemplate}
作為參數值,然后用真實值呈現該模板。
WebTarget
始終假定給定參數為可能的模板,并且不轉義某些字符
但.resolveTemplate()
保證對應轉義的所有字符進行轉義
這篇關于在JAX-RS中轉義查詢參數中的`%‘符號的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,