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

问题描述

我需要使用名为 example.com/api查询参数向 test[] 发送获取请求 为此,我使用弹簧休息模板

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()),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 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中阅读更多内容。

,

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

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