java - Spring Boot 服务器接收带有 %20 而不是空格的参数
问题描述
我有带有控制器和一个端点的弹簧启动服务器:
@GetMapping(path = "/readProperty", produces = "application/json")
public ResponseEntity<ReferenceDataRestResponse> getReferenceDatav4
(WebRequest request) {
Map<String, String[]> parametersMap = new HashMap<>(request.getParameterMap());
....
}
另一个使用 restTemplate.getForEntity 发送请求的 Spring Boot 应用程序
String url = UriComponentsBuilder
.fromHttpUrl(this.referenceDataBaseUrl)
.path(this.referenceDataReadProperty)
.queryParams(new LinkedMultiValueMap(multiValueParams))
.toUriString();
log.info("Reference data URL {}", url);
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);
带有 url 的信息日志打印:
Reference data URL http://some-name:8080/readProperty?channel=E&service_name=Some%20Value
问题是,当我使用 curl 命令和 restTemplate.getForEntity 调用此端点时,我在控制器中收到不同的 service_name 参数值
1.卷曲
当我从日志中复制此 url 并使用 curl 命令调用它时,如下所示:
curl 'http://some-name:8080/readProperty?channel=E&service_name=Some%20Value'
我的端点接收 service_name 参数为
一些价值
2. Java 调用 restTemplate.getForEntity(...)
当java调用这个url时:
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class, new Object[0]);
我的端点接收 service_name 参数为
一些%20值
3. 问题
我应该如何使用 Spring Boot 准备请求以接收控制器解码的参数?
解决方案
发现一个问题。
URL 由 java 服务编码两次。一次通过 toUriString(),第二次通过 restTemplate.getForEntity
当我将发送请求的方法更改为:
String url = UriComponentsBuilder
.fromHttpUrl(this.referenceDataBaseUrl)
.path(this.referenceDataReadProperty)
.queryParams(new LinkedMultiValueMap(multiValueParams))
.toString();
log.info("Reference data URL {}", url);
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);
然后它起作用了,参数值有空格而不是 %20
推荐阅读
- java - Guava getIfPresent() 返回错误
- django - Django:提交表单后如何呈现相同的网页
- python - Python将所有带有参数的函数从另一个文件解析到控制台菜单
- ios - 如何在 iOS 中提高应用程序启动时间?
- r - 在 R 中使用降雪包做一些模拟
- javascript - 使用 js 变量作为 img src
- asp.net-mvc - HttpCookie.Secure 会影响 cookie 本身吗?
- android - 如何使用分页库通过 Retrofit Header 和 Field Maps
- python - 访问对象值
- scala - 向数据帧添加两个时间戳