问题描述
我需要使用名为 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>>() {
});