RestTemplate, чтобы НЕ удалять URL-адрес
Я использую Spring RestTemplate успешно следующим образом:
String url = "http://example.com/path/to/my/thing/{parameter}";
ResponseEntity<MyClass> response = restTemplate.postForEntity(url, payload, MyClass.class, parameter);
И это хорошо.
Однако иногда parameter
есть %2F
. Я знаю, что это не идея, но это то, что есть. Правильный URL должен быть: http://example.com/path/to/my/thing/%2F
, но когда я устанавливаю parameter
в "%2F"
, он получает двойное экранирование до http://example.com/path/to/my/thing/%252F
. Как это предотвратить?
Ответы
Ответ 1
Вместо того, чтобы использовать URL String
, создайте a 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)
, чтобы указать
ли все компоненты, установленные в этом построителе, закодированы (true
) или нет (false
)
Это более или менее эквивалентно замене {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
.
Ответ 2
Вы можете указать шаблон остатка, который вы уже закодировали uri. Это можно сделать с помощью UriComponentsBuilder.build(true). Таким образом, шаблон останова не будет пытаться избежать ури. Большинство остальных шаблонов 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);