【Spring MVC】RestTemplateを使ったAPIアクセス(postForLocationの使い方)

概要

RestTemplate#postForLocationメソッドの基本的な使用方法についてまとめた。
動作確認を行うための事前準備については、以下に記載している。

あわせて読みたい

概要 RESTfulなAPIを呼ぶクライアントライブラリである、RestTemplateの概要についてまとめた。 RestTemplateを使用するための準備と、どんなメソッドがあるのかを紹介している。   前提 今[…]

【Spring MVC】RestTemplateの導入

 

基本的な使い方

RestTemplate#postForLocationメソッドは、POST通信を行ってリソースの作成後に割り当てられたURL(Location ヘッダーの値)を取得する
例えば、新規のユーザーをPOST通信して作成し、そのユーザーのIDを含むURLを取得したい場合などに使用する。

戻り値にLocationヘッダーが設定されていないとNULLとなるため、適切なチェックを行う必要はあるので注意。
また、レスポンスボディも取得できないので注意。

 

実装方法

RestTemplate#postForLocationメソッドは、基本的に以下のように実装する。
戻り値はURI型となる。

postForLocation(URI, 送信するリクエストボディ)

 

使用例

APIアクセスクラスにpostForLocationメソッドを追加し、動作確認を行う。

 

APIアクセスクラス

URIと任意のオブジェクトを指定してPOST通信する。

 

RestClient.java


package com.example.client_prototype.biz;

import java.net.URI;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestClient {

	@Autowired
	private RestTemplate restTemplate;
	
	/**
	 * postForLocationの利用
	 * @param uri
	 * @param requestBody
	 * @return
	 */
	public URI postJsonForLocation(URI uri, Object requestBody) {
		// ロケーションURIを返却
		return restTemplate.postForLocation(uri, requestBody);
	}
}

 

return restTemplate.postForLocation(uri, requestBody);

URIとPOST通信したいリクエストボディを指定する。

 

動作確認

Locationヘッダーが返却されるケースと返却されないケースを確認する。

 

動作確認用クラス


package com.example.client_prototype.executor;

import java.net.URI;
import java.time.LocalDate;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.util.UriComponentsBuilder;

import com.example.client_prototype.biz.RestClient;
import com.example.rest_client_prototype.resources.Resource;

public class Main {

	public static void main(String[] args) {
		try (var context = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext.xml")) {
			// DIコンテナから取得
			var restClient = context.getBean(RestClient.class);
			
			// URI定義
			URI uri = UriComponentsBuilder
					.fromUriString("http://localhost:8080/rest_prototype/rest02/create")
					.build()
					.toUri();
			
			// リクエストボディ
			var req = new Resource("4", "パスタ", LocalDate.of(2022, 5, 1));
			
			// 動作確認
			URI locationUri = restClient.postJsonForLocation(uri, req);
			System.out.println(locationUri);
		}
	}
}

 

URI locationUri = restClient.postJsonForLocation(uri, req);

戻り値はURI型を指定する。

 

Locationヘッダー有

REST APIアプリ側が以下のようにLocationを返却するケース。

 

Locationヘッダー有


// 作成したリソースにアクセスするためのURI
String resourceUri = "http://localhost:8080/rest_prototype/rest01/" + resource.getId();

return ResponseEntity.created(URI.create(resourceUri)).build();

 

コンソール


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

 

Locationヘッダー無

REST APIアプリ側が以下のようにLocationを返却しないケース。

 

Locationヘッダー無


return ResponseEntity.ok().build();

 

コンソール


null

 

まとめ

 

☑ postForLocationを使用することで、リソース作成後のURL(Locationヘッダーに設定)を取得できる

☑ レスポンスの内容は取得できないので注意

☑ Locationヘッダーが設定されていないレスポンスの場合、nullが返却されるので注意

 

スポンサーリンク