Spring RestTemplate API查询参数编码,用于执行GET HTTP请求
url字符串包含需要编码的反斜杠字符。url字符串如下所示Spring RestTemplate API查询参数编码,用于执行GET HTTP请求,spring,http,spring-mvc,get,resttemplate,Spring,Http,Spring Mvc,Get,Resttemplate,url字符串包含需要编码的反斜杠字符。url字符串如下所示 String folder = "\\Foo\\Bar\\"; // some folder search path. String urlString= "http://localhost:8081/certificates/?mypath=%5CFoo%5CBar%5C" // (after encoding) 这里我使用SpringRESTTemplate来执行GET请求。我设置了一个模拟服务器来详细检查请求(如
String folder = "\\Foo\\Bar\\"; // some folder search path.
String urlString= "http://localhost:8081/certificates/?mypath=%5CFoo%5CBar%5C" // (after encoding)
这里我使用SpringRESTTemplate来执行GET请求。我设置了一个模拟服务器来详细检查请求(如果必须知道的话,可以使用Mulesoft设置模拟服务器!)
在这些图像中,您可以看到这两个请求的queryString值不同。其中一个显示\\,而另一个显示%5C,尽管myPath的解析参数值仍然相同
我必须处理一个api,当且仅当queryString看起来像前者时(即“\\”),它似乎才起作用。为什么Spring解析后的queryString显示“%5C”,而这个值显示来自普通Java、curl甚至简单浏览器的请求的双反斜杠
更让我困惑的是,这两个HTTP请求几乎完全相同!然而,为什么queryString/requestUri对这两个请求的解析不同?HTTP GET方法不应该完全由其头内容和请求URI定义吗?在这两个GET请求中,我遗漏了什么
很多问题。花了一整天的时间,但至少我可以验证requestUri/queryString的解析方式似乎与远程api服务器的响应方式一致
谢谢。第二天早上做了一些挖掘工作。结果是
ResponseEntity<String> responseEntity = api.exchange(urlString, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), String.class);
ResponseEntity ResponseEntity=api.exchange(urlString,HttpMethod.GET,新的HttpEntity(新的HttpHeaders()),String.class);
您应该而不是已经对“urlString”进行了编码。“交换”方法在幕后为您进行编码
// 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());
ResponseEntity<String> responseEntity = api.exchange(urlString, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), String.class);