如何在 spring 中发送带有查询参数 "test[]=test" 的请求?

How send request with query parameter "test[]=test" in spring?

我需要使用名为 test[] 的查询参数向 example.com/api 发送获取请求 为此,我使用 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()returnexample.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() 这个 uri 再次转换为 example.com/api?test%5B%5D=test

与此同时,我很容易通过 POSTMan 发送 example.com/api?test[]=test 请求并且成功了。

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

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

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

我找到了一个解决方案。 在我的 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;
}

这个page有人说DefaultUriBuilderFactory.EncodingMode.NONE也合适。 在 link.

中阅读更多内容