java – 使用UriComponentsBuilder编码查询参数
作者:互联网
我正在努力理解UriComponentsBuilder
的行为.我想用它来对查询参数中的URL进行编码,但它似乎只是转义%字符,而不是其他必要的字符,例如& ;.
查询参数中未完全编码的URL示例:
UriComponentsBuilder.fromUri("http://example.com/endpoint")
.queryParam("query", "/path?foo=foo&bar=bar")
.build();
输出:http://example.com/endpoint?query = / path?foo = foo& bar = bar
这是不正确的,因为未编码的&导致bar = bar被解释为/ endpoint而不是/ path的查询参数.
但是,如果我使用包含%字符的输入::
UriComponentsBuilder.fromUri("http://example.com/endpoint")
.queryParam("query", "/path?foo=%20bar")
.build();
输出:http://example.com/endpoint?query = / path?foo =%20bar
%字符被转义.
UriComponentsBuilder会自动转义%字符而不是其他保留字符似乎不一致.
使用UriComponentsBuilder将URL编码为查询参数的正确过程是什么?
解决方法:
>您使用时语法不正确
UriComponentsBuilder.fromUri()用String参数代替
一个URI.如果要将URL作为String传递,请将其用作:
UriComponentsBuilder
.fromUriString("http://example.com/endpoint")
.queryParam("query", URLEncoder.encode("/path?foo=%20bar","UTF-8"))
.build();
>&是一个有效的URL字符,所以它不会被编码,但%不是它的原因
被解码为%.
如果你想看看如何使用与RestTemplate相同的参考:RestTemplate.exchange() does not encode ‘+’?
标签:java,spring,url-encoding,query-parameters 来源: https://codeday.me/bug/20190527/1162994.html