Spring RestTemplate API查询参数编码,用于执行GET HTTP请求

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请求。我设置了一个模拟服务器来详细检查请求(如

url字符串包含需要编码的反斜杠字符。url字符串如下所示

    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);