どうも、とがみんです。
この記事では、JavaのSpring Frameworkの一つである「Spring Boot」を用いて、JSON形式のデータを受け取り、処理結果を返すWebAPIを作成する方法について紹介します。
今回作成するもの
今回は、人間かどうかを判別する簡単なAPIを作成していきます。
以下のように、人間と動物が混じったリストを送信すると、人間(human)のみが返ってくるというものです。
以下のように、typeがhumanとanimalの混じったリストを送信すると、typeがhumanのデータのみ返されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [ { "name": "とがみん", "type": "human" } { "name": "ペンギン", "type": "animal" } { "name": "ぶた", "type": "animal" } ] |
1 2 3 4 5 6 | [ { "name": "とがみん", "type": "human" } ] |
実装方法について
以下のステップで実装していきます。
- 受け取ったデータを保持するクラスの作成。
- 受け取ったJSONデータをリストに格納。
- 人間か動物かを判別するプログラム。
今回作成したファイルは以下の2つです。
上記ステップのそれぞれについて紹介してきます。
受け取ったデータを保持するクラスの作成。
受け取ったデータを格納するためのクラスを作成し、受け取ったJSON型のデータをJavaのプログラムで扱える形に格納するためのものです。
JSON:人間にとって読み書きが容易で、機械にとっても簡単にパースや生成を行なえるデータの形式。
CreatureDTO.javaファイルに以下の内容を記述します。
CreatureDTOクラスは、nameとtypeというプロパティを持ち、それぞれに値をセットするメソッドと、値を読み出すメソッドが書かれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package dto; public class CreatureDTO { //プロパティ private String name; private String type; //名前の読み出し public String getName(){ return name; } //名前のセット public void setName(String name){ this.name = name; } //タイプの読み出し public String getType(){ return type; } //タイプのセット public void setType(String type){ this.type = type; } } |
受け取ったJSONデータをリストに格納。
次に、URLを叩いたあと、JSON形式のデータを受け取り、リストに格納するまでの処理についてです。
humanJudgeController.javaファイルに以下の内容を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.example.demo; //DTOクラスの呼び出し。このファイルで使用できるように。 import dto.CreatureDTO; //リスト。配列と違って格納できるデータは参照型のみ。 import java.util.List; //リストを実装したクラス。 import java.util.ArrayList; //各アノテーションの読み込み import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestBody; @RestController//① public class humanJudgeController { @RequestMapping(value="/judge",method = {RequestMethod.POST})//② //③judgeHumanメソッドについて public List<CreatureDTO> judgeHuman(@RequestBody List<CreatureDTO> creature) { //判別結果を入れるリストを作成。 List<CreatureDTO> resultList = new ArrayList<CreatureDTO>(); //人間かどうかを判定するプログラムを記述 //・・・ return resultList; } } |
①「@RestController」について
@RestControllerは、WebAPI用のコントローラーにつけるアノテーションです。これをつけることにより、メソッドの戻り値を任意のクラスのJavaオブジェクトにすると、「Jackson」というJavaオブジェクトとJSONの相互変換を行うライブラリが呼ばれて、返り値がJSON形式に変換してくれます。
②「@RequestMapping」について
@RequestMappingは、クライアントからのリクエストに対して、リクエストに応じたメソッドやハンドラに対応付けます。
valueは、URLのパスに対応し、methodは、GETやPOSTなどのメソッドを指定できます。
RequestMethod.POSTはPOSTによるアクセスの時にマッチします。
③「@RequestBody」について
@RequestBodyは、リクエストのBodyの内容を取得し、指定された型に値を注入します。JSONのキーにあたる部分と、オブジェクトのプロパティの変数名が一致するものに注入されます。
>Spring’s RequestBody and ResponseBody Annotations
人間か動物かを判別するプログラム。
最後に人間かどうかの判定をするプログラムを記述します。
1 2 3 4 5 | for(int i = 0; i < creature.size(); ++i){ if (creature.get(i).getType().equals("human")) { resultList.add(creature.get(i)); } } |
Listは参照型のため、格納されるデータはアドレスになります。
creature.get(i).getType().equals(“human”)をcreature.get(i).getType() = “human”)と書く右辺には、“human”とか“animal”でなく、それが格納されているアドレスが格納されているので、結果は全てfalseになってしまうので注意が必要です。
動作の確認
動作の確認には、「Postman」というアプリを使用します。Postmanは作成したAPIが正しく動作するかどうかを確かめるためのツールです。
ダウンロードは以下から可能です。
下図のようにすると、作成したAPIの動作を確認することができます。
まとめ
Spring Bootで、JSON形式のデータの受信と送信を行うWebAPIを作成しました。
>Java Spring Bootで簡単・高速にWebAPI開発
>簡単!Spring BootでWebAPIをたたいてJSON形式のレスポンスをjavaオブジェクトに変換
>Spring BootでつくるCRUD API
>Spring MVCのドキュメント「コントローラを実装する」を読む(2)