避免使用Spring的RESTTemplate对URL查询参数进行双重编码
我正在尝试使用Spring的RestTemplate::getForObject来请求具有URL查询参数的URL。
我试过了:
- 使用字符串
- 使用 URI 创建 URI::new
- 使用 URI 创建 URI::创建
- 使用 UriComponentsBuilder 构建 URI
无论我使用哪一个,使用URLEncoder::encode对url查询参数进行编码都会进行双重编码,并且使用此编码会使url查询参数保持未编码状态。
如何在不对URL进行双重编码的情况下发送此请求?方法是:
try {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(detectUrl)
.queryParam("url", URLEncoder.encode(url, "UTF-8"))
.queryParam("api_key", "KEY")
.queryParam("api_secret", "SECRET");
URI uri = builder.build().toUri();
JSONObject jsonObject = restTemplate.getForObject(uri, JSONObject.class);
return jsonObject.getJSONArray("face").length() > 0;
} catch (JSONException | UnsupportedEncodingException e) {
e.printStackTrace();
}
下面是一个示例:
没有URLEncoder:
http://www.example.com/query?url=http://query.param/example&api_key=KEY&api_secret=SECRET
使用 URLEncoder:
http://www.example.com/query?url=http%253A%252F%252Fquery.param%252Fexample&api_key=KEY&api_secret=SECRET
“:”应编码为 %3A,“/”应编码为 %2F。这确实会发生 - 但随后 % 被编码为 %25。