web-dev-qa-db-ja.com

URLをエスケープしない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の場合もあります。これは理想的ではないことは知っていますが、それはそれが何であるかです。正しいURLはhttp://example.com/path/to/my/thing/%2Fですが、parameter"%2F"に設定すると、http://example.com/path/to/my/thing/%252Fに二重にエスケープされます。これを防ぐにはどうすればよいですか?

19
huwr

String URLを使用する代わりに、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メソッドの最初の引数として使用できます。

29

残りのテンプレートに、すでに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);
10
rouble