spring - RestTemplate 交换在 GET 调用上失败,但适用于 CURL
问题描述
我在 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)
解决方案
“n%C3%B8m”部分是 URL 编码的,RestTemplate 再次对其进行 URL 编码,转义 % 符号,生成导致 404 错误的不同 URL。
如果您将 URL 放在代码中,您应该使用 Java 编码(unicode),在这种情况下使用“n\u00F8m”而不是“n%C3%B8m”。
如果您需要在 Java 代码中支持“n%C3%B8m”格式,您可以在使用 RestTemplate 之前使用 URLDecoder 对字符串进行 URL 解码。
推荐阅读
- ios - 使用类似操作的演示文稿 iOS 13
- arrays - Apache Spark 数组模糊比较
- ssh - GitLab 警告:未受保护的私钥文件!'/dev/fd/63' 的权限 0660 太开放
- javascript - 在 Angular 8 中使用 http.get() 调用在 iframe 中显示报告
- ios - 通过 Facebook 应用程序重定向和登录时,IOS Facebook 登录不返回结果
- sql-server - 将数据列表从一个表插入到另一个表asp.net mvc
- firefox - Firefox 更改请求标头键的大小写?
- python - Python如何控制键盘输入
- javascript - 我的应用程序每次尝试使用 app.use 时都会崩溃
- c# - 如何 JSON 序列化实体类?