java—如何在spring中使用查询参数“test[]=test”发送请求?

nc1teljy  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(378)

我需要发送get请求到 example.com/api 查询参数名为 test[] 为此,我使用Spring休息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>>() {
                    });

但是这个uri转换为resttemplate.exchange() example.com/api?test%5B%5D=test 再一次。
同时我很容易发送 example.com/api?test[]=test Postman 的要求和它的工作。
如何向发送请求 example.com/api?test[]=test 在Spring?

a0zr77ik

a0zr77ik1#

我找到了一个解决办法。在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 也很合适。阅读更多链接。

vs3odd8k

vs3odd8k2#

换个衣服就行了 repairUri 方法在调用 restTemplate.exchange 对此:

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

相关问题