【问题标题】:Spring RestTemplate API query parameter encoding for doing a GET HTTP Request用于执行 GET HTTP 请求的 Spring RestTemplate API 查询参数编码
【发布时间】: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


    【解决方案1】:

    第二天早上做了一些挖掘工作。结果,与

        ResponseEntity<String> responseEntity = api.exchange(urlString, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), String.class);
    

    您应该不对 "urlString" 进行编码。 'exchange' 方法在后台为您进行编码。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多