Spring Boot服务器收到的参数中有%20而不是空格。

4

我有一个Spring Boot服务器,其中包含控制器和一个端点:

@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的信息如下:

参考数据URL http://some-name:8080/readProperty?channel=E&service_name=Some%20Value

问题在于,当我使用curl命令或restTemplate.getForEntity调用此端点时,控制器的service_name参数接收到的值不同。

1. Curl

当我从日志中复制这个url并使用curl命令调用它时,像这样:

curl 'http://some-name:8080/readProperty?channel=E&service_name=Some%20Value'

我的端点会将service_name参数作为

Some Value

2. 使用restTemplate.getForEntity(...)进行Java调用

当Java调用此url时:

ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class, new Object[0]);

我的终结点(endpoint)接收到的service_name参数是

Some%20Value

3. 问题

我该如何使用Spring Boot准备请求以在控制器(controller)中接收解码后(decoded)的参数?

1个回答

3

发现一个问题。

Java服务对Url进行了两次编码。第一次是通过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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接