首页 > 解决方案 > 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 准备请求以接收控制器解码的参数?

标签: javaspringspring-bootresttemplate

解决方案


发现一个问题。

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


推荐阅读