RestTemplateを使用してオブジェクトのリストを取得および投稿する
1. 前書き
RestTemplateクラスは、Springでクライアント側のHTTP操作を実行するための中心的なツールです。 HTTP要求を作成し、応答を処理するためのユーティリティメソッドをいくつか提供します。
また、RestTemplateはJackson,とうまく統合されるため、ほとんどのオブジェクトをJSONとの間でシリアル化/逆シリアル化できます。 ただし、working with collections of objects is not so straightforward。
このチュートリアルでは、オブジェクトのリストのGETとPOSTの両方にRestTemplateを使用する方法を説明します。
参考文献:
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
これは、GET動詞を使用して指定されたURIに要求を送信し、応答本文を要求されたJavaタイプに変換します。 これはほとんどのクラスでうまく機能しますが、制限があります:we cannot send lists of objects.
この問題は、Javaジェネリックでの型消去が原因です。 アプリケーションが実行されているとき、リストにあるオブジェクトの種類を認識しません。 This means the data in the list cannot be deserialized into the appropriate type.
幸いなことに、これを回避するための2つのオプションがあります。
3.1. 配列を使う
まず、RestTemplate.getForObject() を使用して、responseTypeパラメータを介してオブジェクトの配列を取得できます。 そこに指定するclassは、ResponseEntityのパラメータタイプと一致します。
ResponseEntity 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 employees;
public EmployeeList() {
employees = new ArrayList<>();
}
// standard constructor and getter/setter
}
これで、より単純なgetForObject()メソッドを使用して、従業員のリストを取得できます。
EmployeeList response = restTemplate.getForObject(
"http://localhost:8080/employees",
EmployeeList.class);
List employees = response.getEmployees();
このコードははるかに単純ですが、追加のラッパーオブジェクトが必要です。
4. RestTemplateでオブジェクトのリストを投稿する
次に、オブジェクトのリストをクライアントからサーバーに送信する方法を見てみましょう。 上記と同様に、RestTemplateはPOSTを呼び出すための簡略化されたメソッドを提供します。
postForObject(URI url、オブジェクトリクエスト、Class
これにより、HTTP POSTがオプションの要求本文とともに指定されたURIに送信され、応答が指定されたタイプに変換されます。 上記のGETシナリオとは異なり、we don’t have to worry about type erasure。
これは、JavaオブジェクトからJSONに移行するためです。 オブジェクトのリストとそのタイプはJVMによって認識されているため、適切にシリアル化されます。
List 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 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 projectで入手できます。