我尝试使用Jersey或Resteasy的任何一个发送带有一些URL字符串作为参数的GET请求
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
,并且在参数中成功逸出后又被服务器成功逸出?
答案 0 :(得分:1)
标准JAX-RS WebTarget
的解决方案是不直接应用参数,而是将其作为模板参数应用。
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()
保证转义所有应该转义的字符