RestTemplate 交换在 GET 调用时失败但在 CURL 上有效

RestTemplate exchange fail on GET call but works on CURL

我有以下 GET 调用在 CURL 中有效

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)

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

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

如果您需要在 Java 代码中支持“n%C3%B8m”格式,您可以在使用 RestTemplate 之前使用 URLDecoder 来 URL-decode 字符串.