在JAX-RS中的查询参数中转义`%`符号

时间:2018-08-31 19:36:36

标签: java escaping jax-rs resteasy jersey-client

我尝试使用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,并且在参数中成功逸出后又被服务器成功逸出?

1 个答案:

答案 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()保证转义所有应该转义的字符