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