我有以下代码(包org.springframework.web.util)
UriComponentsBuilder.fromUriString("/test/").queryParam("rt","http://a.com?u=1").build(false).encode().toUriString()
实际结果: /测试/?RT = http://a.com?u%3D1
我的期望是: /test/?rt=http%3a%2f%2fa.com%3fu%3d1
任何想法?
答案 0 :(得分:0)
根据我的理解,UriComponentsBuilder
不会自动编码查询参数,只会对其实例化的原始HttpUrl
进行编码。换句话说,您仍然必须明确编码:
UriComponentsBuilder根据RFC 3986对您的URI进行编码(请参阅http://www.ietf.org/rfc/rfc3986.txt,特别是第3.4节,其中包含URI的“查询”组件)。
在query
组件中,允许使用字符'/' and ':'
,并且不需要转义。
以'/'
字符为例:query
组件(由未转义的'?'
和(可选)'#'
字符明确分隔),不是分层的'/'
字符没有特殊含义。所以它不需要编码。
UriComponentsBuilder.fromUriString("/test/").queryParam("rt",URLEncoder.encode("http://a.com?u=1", "UTF-8")).build(false).encode().toUriString();
输出:/test/?rt=http%253A%252F%252Fa.com%253Fu%253D1