RestTemplate 不转义 url
RestTemplate to NOT escape 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
。我该如何防止这种情况?
不使用 String
URL,而是使用 UriComponentsBuilder
.
构建 URI
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)
表示
whether all the components set in this builder are encoded (true
) or not (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
方法的第一个参数。
您可以告诉其余模板您已经对 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);
我正在像这样成功地使用 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
。我该如何防止这种情况?
不使用 String
URL,而是使用 UriComponentsBuilder
.
URI
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)
表示
whether all the components set in this builder are encoded (
true
) or not (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
方法的第一个参数。
您可以告诉其余模板您已经对 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);