概要
UriComponentsBuilderはspring-webが提供するライブラリで、URLを動的に構築するために使用するクラスとなる。
パスパラメータを動的に設定したりクエリパラメータを動的に設定したりと、UriComponentsBuilderを使用することでURL作成が楽になる。
今回はUriComponentsBuilderの基本的な使用方法についてまとめた。
パスパラメータの設定
URLテンプレート(プレースホルダーを含んだURLのひな型)を使用して、動的にURLを作成する。
パスパラメータの値をバインドさせる方法は、以下のような方法がある。
・配列を設定する
・マップを設定する
直接値を設定
パスパラメータが1つしかない場合、直接バインドさせたい値を設定できる。
直接値を設定する方法
URI uri = UriComponentsBuilder
.fromUriString("/uri_test/{id}") // URLテンプレート
.buildAndExpand(123)
.toUri();
System.out.println(uri); // 出力: /uri_test/123
プレースホルダーの「{id}」にバインドさせたいパスパラメータの値を直接設定する。
配列を設定
パスパラメータが複数ある場合、Object型の配列を使用して格納順にバインドできる。
Object型の配列を使用する方法
URI uri = UriComponentsBuilder
.fromUriString("/uri_test/{name}/hoge/{id}") // URLテンプレート
.buildAndExpand(new Object[] { "山田", 2 })
.toUri();
System.out.println(uri); // 出力: /uri_test/山田/hoge/2
プレースホルダーの「{name}」「{id}」に、配列の値が格納順にバインドされる。
マップを設定
マップを使用することで、URLテンプレートに設定したプレースホルダーの変数に合わせてパスパラメータをバインドできる。
マップを使用する方法
Map<String, Object> pathParams = Map.of("id", 2, "name", "山田");
URI uri = UriComponentsBuilder
.fromUriString("/uri_test/{name}/hoge/{id}") // URLテンプレート
.buildAndExpand(pathParams)
.toUri();
System.out.println(uri); // 出力: /uri_test/山田/hoge/2
(中略)
.buildAndExpand(pathParams)
キーにプレースホルダーの変数名を指定することで、動的にパスパラメータのバインドが可能。
クエリパラメータの設定
クエリパラメータを動的に作成する。
動的にクエリパラメータを作成する方法
URI uri = UriComponentsBuilder
.fromUriString("/uri_test")
.queryParam("page", 1)
.queryParam("name", "山田太郎")
.build()
.toUri();
System.out.println(uri); // 出力: /uri_test?page=1&name=山田太郎
クエリパラメータの数だけ上記メソッドを呼ぶことで、動的に作成可能。
URLエンコード
URLエンコードも簡単に実装できる。
URLエンコードを行う方法
URI uri = UriComponentsBuilder
.fromUriString("/uri_test")
.queryParam("page", 1)
.queryParam("name", "山田太郎")
.build()
.encode()
.toUri();
System.out.println(uri); // 出力: /uri_test?page=1&name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E
上記メソッドを呼び出すことで、URLエンコードできる。
相対パスのURL作成
ホスト情報やポート情報などを保持した状態で、相対的にURLを作成できる。
相対的なURLの作成方法
@PostMapping(value = "rest06/create")
public ResponseEntity<Void> post(@RequestBody ResourceReq req, UriComponentsBuilder builder) {
// リソース登録
var resource = new Resource(req.getId(), req.getName(), req.getHogeDate());
service.create(resource);
// ヘッダー設定用URI
URI uri = builder
.path("/rest01/{id}")
.buildAndExpand(resource.getId())
.toUri();
return ResponseEntity.created(uri).build();
}
(中略)
.path(“/rest01/{id}”)
引数でUriComponentsBuilderを受け取り、pathメソッドを使用することで簡単に相対パスのURLを作成できる。
例えば以下のようなURLが作成される。
ホスト情報+ポート情報+コンテキストパス情報(http://localhost:8080/rest_prototype)以降の相対パスを指定するだけ。
まとめ
☑ buildAndExpandメソッドを使用して、動的にパスパラメータを作成できる
☑ queryParamメソッドを使用して、動的にクエリパラメータを作成できる
☑ UriComponentsBuilderをコントローラーの引数で取得することで、リクエストのホスト情報を保持した状態でURLを作成できる