【问题标题】:RestTemplate exchange fail on GET call but works on CURLRestTemplate 交换在 GET 调用上失败,但适用于 CURL
【发布时间】:2021-02-11 23:35:17
【问题描述】:

我在 CURL 中有以下 GET 调用工作

curl -X GET 'https://us.api.blizzard.com/profile/wow/character/kiljaeden/n%C3%B8m?access_token=123&namespace=profile-us&locale=en_US'

但是下面的 Java 代码给出了 404 错误

String testurl = "https://us.api.blizzard.com/profile/wow/character/kiljaeden/n%C3%B8m?access_token=123&namespace=profile-us&locale=en_US";

RestTemplate restTemplate = new RestTemplate();

String out = restTemplate.getForObject(testurl, String.class);

准确的错误

org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:85)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)

【问题讨论】:

  • 您可以访问webhook.site,它将为您分配一个唯一的回调 URL。然后使用 CURL 并使用您的代码将请求发送到该 URL。该网站将向您显示这两个请求,因此您可以轻松检查 url 参数、标头等的编码是否存在差异。
  • 哇,谢谢,这对我帮助很大。在curl请求中,url的一部分是“n%C3%B8m”,但是在Java里面,RestTemplate把它变成了“n%2525C3%2525B8m”,这是怎么回事?
  • Java 中的问题是您已经对 URL 的那一部分进行了 URL 编码,RestTemplate 将再次对其进行 URL 编码(转义 % 符号,生成额外的内容)。因此,如果您将 URL 正确放入代码中,您应该使用 java 默认编码 (unicode),即在 Java 代码中放入“n\u00F8m”而不是“n%C3%B8m”。如果您需要在 Java 代码中继续使用“n%C3%B8m”,您应该在使用 RestTemplate 之前使用 URLDecoder 对 URL 进行 URL 解码。
  • 好的谢谢我给你答案

标签: spring spring-boot rest resttemplate


【解决方案1】:

“n%C3%B8m”部分是 URL 编码的,RestTemplate 再次对其进行 URL 编码,转义 % 符号,生成导致 404 错误的不同 URL。

如果您将 URL 放在代码中,您应该使用 Java 编码(unicode),在这种情况下使用“n\u00F8m”而不是“n%C3%B8m”。

如果您需要在 Java 代码中支持“n%C3%B8m”格式,您可以在使用 RestTemplate 之前使用 URLDecoder 对字符串进行 URL 解码。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 2020-07-07
    • 1970-01-01
    • 2013-09-09
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多