【发布时间】:2015-12-16 20:21:47
【问题描述】:
我正在尝试使用 Spring 的 RestTemplate::getForObject 来请求具有 URL 查询参数的 URL。
我试过了:
- 使用字符串
- 使用 URI::new 创建 URI
- 使用 URI::create 创建 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。
【问题讨论】:
-
请提供一个示例 URI 以及它是如何被双重编码的。
-
@SotiriosDelimanolis 我添加了一个 URI 双编码示例。
-
我不认为 URL 规范要求对
:或/进行编码。您应该可以直接使用http://www.example.com/query?url=http://query.param/example&api_key=KEY&api_secret=SECRET。