RestTemplate to NOT escape url

时间:2015-01-28 00:51:19

标签: java spring resttemplate

我成功使用Spring RestTemplate:

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

这很好。

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

2 个答案:

答案 0 :(得分:28)

不是使用String网址,而是使用URI构建UriComponentsBuilder

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);

然后,您可以使用此URI对象作为postForObject方法的第一个参数。

答案 1 :(得分:9)

您可以告诉其余模板您已经编码了uri。这可以使用UriComponentsBuilder.build(true)完成。这样休息模板将不会重新尝试逃避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);