1. 序章

RestTemplate クラスは、Springでクライアント側のHTTP操作を実行するための中心的なツールです。 HTTP要求を作成し、応答を処理するためのいくつかのユーティリティメソッドを提供します。

また、 RestTemplateJacksonとうまく統合されるため、は、ほとんどのオブジェクトをJSONとの間でシリアル化/逆シリアル化できます。 ただし、オブジェクトのコレクションの操作はそれほど単純ではありません

このチュートリアルでは、RestTemplateを使用してオブジェクトのリストをGETおよびPOSTする方法を学習します。

2. サービス例

2つのHTTPエンドポイントを持つ従業員APIを使用し、すべてを取得して以下を作成します。

  • GET / employee
  • POST/従業員

クライアントとサーバー間の通信には、単純なDTOを使用して基本的な従業員データをカプセル化します。

public class Employee {
    public long id;
    public String title;

    // standard constructor and setters/getters
}

これで、RestTemplateを使用してEmployeeオブジェクトのリストを取得および作成するコードを作成する準備が整いました。

3. RestTemplateを使用してオブジェクトのリストを取得します

通常、GETを呼び出すときは、 RestTemplate の簡略化されたメソッドの1つ(など)を使用できます。

getForObject(URI url、Class responseType)

これにより、GET動詞を使用して指定されたURIにリクエストが送信され、レスポンスの本文がリクエストされたJavaタイプに変換されます。 これはほとんどのクラスでうまく機能しますが、制限があります。オブジェクトのリストを送信できません。

この問題は、Javaジェネリックによる型消去が原因です。 アプリケーションの実行中は、リストに含まれるオブジェクトのタイプを認識していません。 これは、リスト内のデータを適切なタイプに逆シリアル化できないことを意味します。

幸い、これを回避するための2つのオプションがあります。

3.1. 配列の使用

まず、RestTemplate。 getForEntity()を使用して、responseTypeパラメーターを介してオブジェクトの配列を取得できます。 クラスで指定するものはすべて、ResponseEntityのパラメータタイプと一致します。

ResponseEntity<Employee[]> response =
  restTemplate.getForEntity(
  "http://localhost:8080/employees/",
  Employee[].class);
Employee[] employees = response.getBody();

RestTemplate.exchangeを使用して同じ結果を達成することもできます。

ここで手間のかかる作業を行っている共同作業者はResponseExtractor、であるため、さらにカスタマイズが必要な場合は、 execute を呼び出して、独自のインスタンスを提供できます。

3.2. ラッパークラスの使用

一部のAPIは、リストを直接返すのではなく、従業員のリストを含むトップレベルオブジェクトを返します。 この状況を処理するために、従業員のリストを含むラッパークラスを使用できます。

public class EmployeeList {
    private List<Employee> employees;

    public EmployeeList() {
        employees = new ArrayList<>();
    }

    // standard constructor and getter/setter
}

これで、より単純な getForObject()メソッドを使用して、従業員のリストを取得できます。

EmployeeList response = restTemplate.getForObject(
  "http://localhost:8080/employees",
  EmployeeList.class);
List<Employee> employees = response.getEmployees();

このコードははるかに単純ですが、追加のラッパーオブジェクトが必要です。

4. RestTemplateを使用してオブジェクトのリストを投稿する

次に、オブジェクトのリストをクライアントからサーバーに送信する方法を見てみましょう。 上記と同様に、 RestTemplate は、POSTを呼び出すための簡略化されたメソッドを提供します。

postForObject(URI url、オブジェクトリクエスト、クラス responseType)

これにより、オプションのリクエスト本文を使用して、指定されたURIにHTTP POSTが送信され、応答が指定されたタイプに変換されます。 上記のGETシナリオとは異なり、型消去について心配する必要はありません

これは、JavaオブジェクトからJSONに移行するためです。 オブジェクトのリストとそのタイプはJVMによって認識されているため、適切にシリアル化されます。

List<Employee> newEmployees = new ArrayList<>();
newEmployees.add(new Employee(3, "Intern"));
newEmployees.add(new Employee(4, "CEO"));

restTemplate.postForObject(
  "http://localhost:8080/employees/",
  newEmployees,
  ResponseEntity.class);

4.1. ラッパークラスの使用

上記のGETシナリオと一貫性を保つためにラッパークラスを使用する必要がある場合は、それも簡単です。 RestTemplateを使用して新しいリストを送信できます。

List<Employee> newEmployees = new ArrayList<>();
newEmployees.add(new Employee(3, "Intern"));
newEmployees.add(new Employee(4, "CEO"));

restTemplate.postForObject(
  "http://localhost:8080/employees",
  new EmployeeList(newEmployees),
  ResponseEntity.class);

5. 結論

RestTemplate の使用は、サービスと通信するためのHTTPクライアントを構築する簡単な方法です。

これは、すべてのHTTPメソッドと単純なオブジェクトを操作するための多数のメソッドを提供します。 少し余分なコードを追加するだけで、オブジェクトのリストを簡単に操作できます。

いつものように、完全なコードはGithubプロジェクトで入手できます。