概要
RestTemplate#exchangeメソッドの基本的なGET通信の使用方法についてまとめた。
動作確認を行うための事前準備については、以下に記載している。
概要 RESTfulなAPIを呼ぶクライアントライブラリである、RestTemplateの概要についてまとめた。 RestTemplateを使用するための準備と、どんなメソッドがあるのかを紹介している。 前提 今[…]
基本的な使い方
exchangeメソッドは、HTTP メソッド(GET, POST, PUT, DELETE など)を柔軟に扱うことができる。
戻り値は、HTTPステータス/ヘッダー/ボディを含むResponseEntityオブジェクトとなる。
今回は基本的なGET通信を行う方法について紹介する。
実装方法
RestTemplate#exchangeメソッドを使用してGET通信を行うには、基本的に以下のように実装する。
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);
}
}
シンプルなオブジェクトをボディに含む、ResponseEntityを取得するメソッド。
ジェネリクスを含むリストをボディに含む、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());
指定したURIにGETリクエストを行うRequestEntityクラスを作成している。
buildメソッドにより、ボディ部がないオブジェクトが作成される。
作成したリクエスト情報(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());
作成したリクエスト情報(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());
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を使用することで、ジェネリクスを含むオブジェクトを取得できる