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

2023-09-04 02:28:29 作者:心痛谁能懂

我尝试使用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文档中没有找到任何关于这种行为的词。

SpringBoot2.x教程 整合JAX RS之利用Jersey框架实现RESTful

是否应在将字符串添加为参数之前对其进行转义? 我应该使用什么转义程序来确保它转义了"%..." 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()保证对应转义的所有字符进行转义