编程语言
首页 > 编程语言> > java – 使用UriComponentsBuilder编码查询参数

java – 使用UriComponentsBuilder编码查询参数

作者:互联网

我正在努力理解UriComponentsBuilder的行为.我想用它来对查询参数中的URL进行编码,但它似乎只是转义%字符,而不是其他必要的字符,例如&amp ;.

查询参数中未完全编码的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