【Spring】UriComponentsBuilderの基本的な使い方

概要

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

 

.buildAndExpand(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

 

.buildAndExpand(new Object[] { “山田”, 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

 

Map<String, Object> pathParams = Map.of(“id”, 2, “name”, “山田”);
(中略)
.buildAndExpand(pathParams)

キーにプレースホルダーの変数名を指定することで、動的にパスパラメータのバインドが可能。

 

クエリパラメータの設定

クエリパラメータを動的に作成する。

 

動的にクエリパラメータを作成する方法


URI uri = UriComponentsBuilder
        .fromUriString("/uri_test")
        .queryParam("page", 1)
        .queryParam("name", "山田太郎")
        .build()
        .toUri();

System.out.println(uri);  // 出力: /uri_test?page=1&name=山田太郎

 

.queryParam(“page”, 1)

クエリパラメータの数だけ上記メソッドを呼ぶことで、動的に作成可能。

 

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

 

.encode()

上記メソッドを呼び出すことで、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();
}

 

public ResponseEntity<Void> post(@RequestBody ResourceReq req, UriComponentsBuilder builder) {
(中略)
.path(“/rest01/{id}”)

引数でUriComponentsBuilderを受け取り、pathメソッドを使用することで簡単に相対パスのURLを作成できる。
例えば以下のようなURLが作成される。

http://localhost:8080/rest_prototype/rest01/4

ホスト情報+ポート情報+コンテキストパス情報(http://localhost:8080/rest_prototype)以降の相対パスを指定するだけ。

 

まとめ

 

☑ buildAndExpandメソッドを使用して、動的にパスパラメータを作成できる

☑ queryParamメソッドを使用して、動的にクエリパラメータを作成できる

☑ UriComponentsBuilderをコントローラーの引数で取得することで、リクエストのホスト情報を保持した状態でURLを作成できる

 

スポンサーリンク