【Spring MVC】RestTemplateを使ったAPIアクセス(exchangeを使ったGET通信)

概要

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

あわせて読みたい

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

【Spring MVC】RestTemplateの導入

 

基本的な使い方

exchangeメソッドは、HTTP メソッド(GET, POST, PUT, DELETE など)を柔軟に扱うことができる
戻り値は、HTTPステータス/ヘッダー/ボディを含むResponseEntityオブジェクトとなる

今回は基本的なGET通信を行う方法について紹介する。

 

実装方法

RestTemplate#exchangeメソッドを使用してGET通信を行うには、基本的に以下のように実装する。

RequestEntity<Void> reqEntity = RequestEntity.get(URI情報).build();
exchange(reqEntity, 取得したいレスポンスの型);

「RequestEntity.get」と指定することで、GET通信が可能となる

戻り値は指定したレスポンスの型をボディにもつResponseEntityとなる。
尚、RequestEntityにはリクエストヘッダー/ボディ/HTTPメソッド(今回はGET)を指定できる

 

使用例

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

 

APIアクセスクラス

exchangeを使用したメソッドを追加する。

 

RestClient.java


package com.example.client_prototype.biz;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestClient {

	@Autowired
	private RestTemplate restTemplate;
	
	/**
	 * exchangeの利用
	 * @param <T>
	 * @param requestEntity
	 * @param responseType
	 * @return
	 */
	public <T> ResponseEntity<T> exchange(RequestEntity<?> requestEntity, Class<T> responseType) {
		return restTemplate.exchange(requestEntity, responseType);
	}
	
	/**
	 * exchangeの利用
	 * @param <T>
	 * @param requestEntity
	 * @param responseType
	 * @return
	 */
	public <T> ResponseEntity<List<T>> exchange(RequestEntity<?> requestEntity, ParameterizedTypeReference<List<T>> responseType) {
	    return restTemplate.exchange(requestEntity, responseType);
	}
}

 

public <T> ResponseEntity<T> exchange(RequestEntity<?> requestEntity, Class<T> responseType) {

シンプルなオブジェクトをボディに含む、ResponseEntityを取得するメソッド。

 

public <T> ResponseEntity<List<T>> exchange(RequestEntity<?> requestEntity, ParameterizedTypeReference<List<T>> responseType) {

ジェネリクスを含むリストをボディに含む、ResponseEntity返却するメソッド。
ParameterizedTypeReferenceにリストを指定することで、戻り値をリストで取得できる。

 

動作確認

動作確認を行う。

文字列

戻り値にStringを指定する。

 

動作確認用クラス


// GETリクエスト
RequestEntity<Void> reqEntity = RequestEntity.get(URI.create("http://localhost:8080/rest_prototype/rest01/1")).build();
ResponseEntity<String> resEntity = restClient.exchange(reqEntity, String.class);

// 動作確認
System.out.println(resEntity.getStatusCode());
System.out.println(resEntity.getHeaders());
System.out.println(resEntity.getBody());

 

RequestEntity<Void> reqEntity = RequestEntity.get(URI.create(“http://localhost:8080/rest_prototype/rest01/1”)).build();

指定したURIにGETリクエストを行うRequestEntityクラスを作成している。
buildメソッドにより、ボディ部がないオブジェクトが作成される。

 

ResponseEntity<String> resEntity = restClient.exchange(reqEntity, String.class);

作成したリクエスト情報(RequestEntity)をもとにAPI通信を行い、文字列で結果を取得している。

 

コンソール


200 OK
[Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Date:"Sun, 23 Mar 2025 10:40:28 GMT", Keep-Alive:"timeout=20", Connection:"keep-alive"]
{"id":"1","name":"りんご","hogeDate":"2025-02-01"}

 

オブジェクト

戻り値にResourceクラスを指定する。

 

動作確認用クラス


// GETリクエスト
RequestEntity<Void> reqEntity = RequestEntity.get(URI.create("http://localhost:8080/rest_prototype/rest01/1")).build();
ResponseEntity<Resource> resEntity = restClient.exchange(reqEntity, Resource.class);

// 動作確認
System.out.println(resEntity.getStatusCode());
System.out.println(resEntity.getHeaders());
System.out.println(resEntity.getBody());

 

ResponseEntity<Resource> resEntity = restClient.exchange(reqEntity, Resource.class);

作成したリクエスト情報(RequestEntity)をもとにAPI通信を行い、オブジェクトで結果を取得している。

 

コンソール


200 OK
[Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Date:"Sun, 23 Mar 2025 10:54:51 GMT", Keep-Alive:"timeout=20", Connection:"keep-alive"]
Resource(id=1, name=りんご, hogeDate=2025-02-01)

 

リスト

戻り値にList<Resource>を指定する。

 

動作確認用クラス


// GETリクエスト
RequestEntity<Void> reqEntity = RequestEntity.get(URI.create("http://localhost:8080/rest_prototype/rest05/")).build();
ResponseEntity<List<Resource>> resEntity = restClient.exchange(reqEntity, new ParameterizedTypeReference<List<Resource>>() {});

// 動作確認
System.out.println(resEntity.getStatusCode());
System.out.println(resEntity.getHeaders());
System.out.println(resEntity.getBody());

 

ResponseEntity<List<Resource>> resEntity = restClient.exchange(reqEntity, new ParameterizedTypeReference<List<Resource>>() {});

ParameterizedTypeReferenceを使って、ジェネリクスを持つ型を指定することができる。
上記はレスポンスにListを指定して取得している。

 

コンソール


200 OK
[Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Date:"Tue, 25 Mar 2025 00:07:57 GMT", Keep-Alive:"timeout=20", Connection:"keep-alive"]
[Resource(id=1, name=りんご, hogeDate=2025-02-01), Resource(id=2, name=ごりら, hogeDate=2024-06-05), Resource(id=3, name=らっぱ, hogeDate=2023-05-10)]

 

 

まとめ

 

☑ exchangeはあらゆるHTTPメソッドを扱え、ヘッダーやボディを自由に指定できる

☑ RequestEntityクラスのgetメソッドを利用してGET通信を行う

☑ ParameterizedTypeReferenceを使用することで、ジェネリクスを含むオブジェクトを取得できる

 

スポンサーリンク