RestTemplate to Not escape url

2022-09-01 20:11:01

我正在成功地使用Spring RestTemplate,如下所示:

String url = "http://example.com/path/to/my/thing/{parameter}";
ResponseEntity<MyClass> response = restTemplate.postForEntity(url, payload, MyClass.class, parameter);

这很好。

但是,有时是 。我知道这并不理想,但事实就是如此。正确的URL应该是:但是当我设置为它时,它会被双重转义为.如何防止这种情况?parameter%2Fhttp://example.com/path/to/my/thing/%2Fparameter"%2F"http://example.com/path/to/my/thing/%252F


答案 1

不要使用 URL,而是使用 .StringURIUriComponentsBuilder

String url = "http://example.com/path/to/my/thing/";
String parameter = "%2F";
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).path(parameter);
UriComponents components = builder.build(true);
URI uri = components.toUri();
System.out.println(uri); // prints "http://example.com/path/to/my/thing/%2F"

使用 UriComponentsBuilder#build(boolean) 来指示

此生成器中设置的所有组件是否都已编码 (truefalse)

这或多或少等同于自己替换和创建对象。{parameter}URI

String url = "http://example.com/path/to/my/thing/{parameter}";
url = url.replace("{parameter}", "%2F");
URI uri = new URI(url);
System.out.println(uri);

然后,可以将此对象用作该方法的第一个参数。URIpostForObject


答案 2

您可以告诉其余模板您已经对 uri 进行了编码。这可以使用UriComponentsBuilder.build(true)来完成。这样,rest 模板将不会重新尝试转义 uri。大多数其余模板 API 将接受 URI 作为第一个参数。

String url = "http://example.com/path/to/my/thing/{parameter}";
url = url.replace("{parameter}", "%2F");
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url);
// Indicate that the components are already escaped
URI uri = builder.build(true).toUri();
ResponseEntity<MyClass> response = restTemplate.postForEntity(uri, payload, MyClass.class, parameter);

推荐