在JAX-RS中的查询参数中转义`%`符号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAX-RS中的查询参数中转义`%`符号相关的知识,希望对你有一定的参考价值。
我尝试使用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
,并且在服务器中成功解除参与其中的一个参数逃脱?
答案
标准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()
保证逃脱应该逃脱的所有角色
以上是关于在JAX-RS中的查询参数中转义`%`符号的主要内容,如果未能解决你的问题,请参考以下文章
需要在 .htaccess 重写规则中转义 # (hash/pound) 字符