【发布时间】:2019-10-15 20:48:02
【问题描述】:
url 字符串包含需要编码的反斜杠字符。 url字符串如下。
String folder = "\\Foo\\Bar\\"; // some folder search path.
String urlString= "http://localhost:8081/certificates/?mypath=%5CFoo%5CBar%5C" // (after encoding)
这里我使用 Spring RestTemplate 来做一个 GET 请求。我设置了一个模拟服务器来详细检查请求(使用 Mulesoft 模拟服务器设置,如果你必须知道的话!)。
ResponseEntity<String> responseEntity = api.exchange(urlString, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), String.class);
这里我使用普通的 Java URLConnection 来执行请求。附有详细请求快照的图片。
// 2. Plain vanilla java URLConnection. "result.toString()" has certificate match.
StringBuilder result = new StringBuilder();
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("X-Venafi-Api-Key", apiKey);
conn.setRequestMethod("GET");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
System.out.println(result.toString());
在图片中,您可以看到这两个请求的 queryString 值不同。其中一个显示 \\ 而另一个显示 %5C,尽管 myPath 的解析参数值仍然相同。
我不得不处理一个似乎只有在 queryString 看起来像前者(即 "\\")时才有效的 api。为什么解析后的 Spring 查询字符串显示“%5C”,而该值显示来自普通 Java、curl 甚至简单浏览器的请求的双反斜杠?
更让我感到困惑的是甚至,这两个 HTTP 请求的所有内容都相同!然而,为什么 queryString/requestUri 对这两个请求的解析不同?不应该是HTTP GET方法完全由它的头内容和requestUri定义吗?在这两个 GET 请求中我错过了什么?
很多问题。花了一整天,但至少我可以验证 requestUri/queryString 的解析方式似乎与远程 api-server 的响应方式一致。
谢谢。
【问题讨论】:
标签: spring http spring-mvc get resttemplate