1

我需要使用example.com/api名为的查询参数发送获取请求test[] 为此我使用spring rest tepmlate

UriComponentsBuilder builder = UriComponentsBuilder
                .fromUriString(example.com/api)
                .queryParam(test[], "test");

responseEntity = restTemplate.exchange(builder.toUriString(), HttpMethod.GET,
                    new HttpEntity<>(this.setHttpHeader()),
                    new ParameterizedTypeReference<List<MyDTO>>() {
                    });

但是builder.toUriString()返回example.com/api?test%5B%5D=test 我尝试用我的方法替换 srting

private String repairUri(String uri) {
        return url.replaceAll("%5B%5D", "[]");
    }

并打电话

responseEntity = restTemplate.exchange(repairUri(builder.toUriString()), HttpMethod.GET,
                    new HttpEntity<>(this.setHttpHeader()),
                    new ParameterizedTypeReference<List<MyDTO>>() {
                    });

但是进入 restTemplate.exchange() 这个 uriexample.com/api?test%5B%5D=test再次转换。

同时,我很容易example.com/api?test[]=test通过 POSTMan 发送请求并且它的工作。

我如何example.com/api?test[]=test在 Spring 中发送请求?

4

2 回答 2

2

我找到了一种解决方案。在我的 restTemplate bean 定义中,我添加了以下设置:

public RestTemplate myRestTemplate() {

    RestTemplate restTemplate = restTemplate(timeout);

    DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
    builderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
    restTemplate.setUriTemplateHandler(builderFactory);
    restTemplate.setErrorHandler(new RestClientResponseExceptionHandler());

    return restTemplate;
}

在此页面中,有些人说这DefaultUriBuilderFactory.EncodingMode.NONE也合适。在链接中阅读更多内容。

于 2021-02-08T16:40:24.817 回答
0

repairUri当您调用 this 时,只需将您的方法更改restTemplate.exchange为 this :

responseEntity = restTemplate.exchange(URLDecoder.decode(builder.toUriString(), "UTF-8"), HttpMethod.GET,
                new HttpEntity<>(this.setHttpHeader()),
                new ParameterizedTypeReference<List<MyDTO>>() {
                });
于 2021-02-08T15:43:47.053 回答