Spring BootのRESTウェブサービスのサンプルアプリのソースコードを見る

Sprint Boot2.3の入門ページです。Spring Bootを使ったRESTサービスのサンプルアプリのソースコードの解説と動作確認をしています。Spring Bootを初めて学習しようと考えている初心者・入門者の方は、参考にしてください。

環境と今回の目的

最終更新日:2021/5/5

以前にSpringの入門ガイド用のサンプルプロジェクトをEclipseからインポートし、動作確認などをしてみました。
Spring Bootの入門用サンプルプロジェクトをEclipseにインポートして動かしてみる

今回は、インポートしたSpring BootのRESTのウェブサービスのソースコードを見たり、動作確認などもしてみたいと思います。

・開発環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)、(*2020/8/28時点の最新安定版です)
Spring Boot:バージョン2.3

◾️Eclipse(Pleiades All in One、Java Full Edition版)
Eclipse(Pleiades All in One、Java Full Edition版)は、最初からEclipseの日本語化がされていますし、STS(Spring Tool Suite)やLombokなどの複数の有用なプラグインも入っていて設定済みなので、開発環境構築の手間が省けます。
Eclipseの導入については別ページに書いていますので、参考にしてください。

【Java初心者】Eclipse(Pleiades All in One)をインスールしてJava開発ができるようにする【macOS版】

HTTPリクエストを受け付けるコントローラクラス、@RestController

◾️Spring BootのRESTサービスのサンプルアプリについて
ここからは、Spring BootのRESTサービスのサンプルアプリをEclipseにインポートしている前提で話を進めます。
最初に書きましたが、サンプルアプリのインポートについては別ページで説明していますので、そちらを参考にしてください。

Spring Bootの入門用サンプルプロジェクトをEclipseにインポートして動かしてみる

アプリのインポートだけでなく、アプリの動作確認やインポート時には無効になっているホットリロード機能を有効にする方法なども説明しています。

また、RESTについてはこちらのサイトを参考にしてください。
REST【Representational State Transfer】とは?

今回インポートしたサンプルアプリは、とてもシンプルなSpring BootのRESTウェブサービスです。
ソースファイルは、"com.example.restservice"パッケージにある3ファイルだけです。

$ tree gs-rest-service-complete/src/main/
gs-rest-service-complete/src/main/
└── java
    └── com
        └── example
            └── restservice
                ├── Greeting.java
                ├── GreetingController.java
                └── RestServiceApplication.java

3ファイルのうち、RestServiceApplication.javaはSpring Bootアプリのエントリポイント(起動するためのスタートポイント)があるだけなので、今回このファイルは気にしません。

また、Greeting.javaは、"id"と"content"の2つの属性を持つPOJO(Plain Old Java Object)です。
このGreetingオブジェクトが、今回のRESTサービスのGETリクエストのレスポンスデータになります。

public class Greeting {
  private final long id;
  private final String content;
~
}

そして、今回のRESTウェブサービスの肝の部分が、コントローラのGreetingControllerクラスですので、ソースコードを見ていきます。

//import文などは省略
@RestController
public class GreetingController {

	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}

と言っても、とてもシンプルで短いコードです。メソッドもgreetingメソッド1つしかありません。Spring Bootはこれだけのコード量で、JSON形式のRESTウェブサービスを作る事ができるという事です。

まず、GreetingControllerクラスは@RestControllerアノテーションを付けています。@RestControllerはリクエスト側にJSONやXMLなどのデータを返す時に使います。

@Controllerアノテーション
コントローラクラスが付けるアノテーションは、@RestControllerの他にも@Controllerアノテーションがあります。@ControllerはMVCのウェブアプリのコントローラクラスに付けます。MVCですので、リクエスト側にはView(HTML、実際はThymeleafなどのテンプレートエンジン)を指定して返します。

そして、greetingメソッドは@GetMapping("/greeting")アノテーションを付けています。これで、「http://localhost:8080/greeting」にHTTPのGETリクエストした時にこのメソッドが呼び出されます。

@PostMapping、@RequestMapping
HTTPのPOSTリクエストを受けたい時は@PostMappingを使います。
また、GET・POST関係なく両方を受けたい時は@RequestMappingを使います。

次に、greetingメソッドの引数についてです。メソッドの定義部分だけを改めて書いてみます。

public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name)
引数の@RequestParam(value = "name")は、クエリストリングのパラメータキーが"name"のHTTPリクエストを受ける事ができます。

ですので、このURLでHTTPリクエストが受けられるようになります。

http://localhost:8080/greeting?name=HogeUser

また、defaultValue = "World"は、クエリストリングで"name"を指定しなかった時のデフォルト値です。
defaultValueを省略した場合、クエリストリングの"name"を指定すれば正常に動作しますが、指定しないとエラーになります。
ブラウザでは「Whitelabel Error Page」というエラーページが表示されますし、curlコマンドでリクエストすれば「"error": "Bad Request」というエラーが返ってきます。

また、クエリストリングのパラメータキーとgreetingメソッドで受け取る引数名が同じならvalueを省略できます。

public Greeting greeting(@RequestParam(defaultValue = "World") String name)

次に、greetingメソッドの戻り値についてです。greetingメソッドは、Greetingオブジェクトを返します。
上の方でも書きましたが、Greetingクラスは、"id"と"content"の2つの属性を持つPOJO(Plain Old Java Object)です。
このGreetingオブジェクトが、HTTPリクエストのレスポンスデータになります。

サンプルアプリの実行と動作確認

実際にアプリを起動し、HTTPリクエストをして動作確認をしていきます。

アプリの起動方法は、プロジェクトを右クリックし、"実行" -> "Spring Bootアプリケーション"を選択すれば起動します。
迷った方は、別ページに図解で説明していますので、参考にしてください。
インポートしたSpring Bootのサンプルプロジェクトを実行して動作確認をする

動作確認はブラウザで「http://localhost:8080/greeting」にアクセスしてもできますが、ここではcurlコマンドを使います。
まずは、クエリストリングを指定せずにリクエストします。

$ curl http://localhost:8080/greeting
{"id":1,"content":"Hello, World!"}

Greetingクラスの"id"と"content"がJSON形式で返ってきました。
クエリストリングを指定しない場合、"content"データの一部はデフォルト値の"World"になります。

次に、クエリストリングにname=HogeUserを指定してリクエストします。

$ curl http://localhost:8080/greeting?name=HogeUser
{"id":2,"content":"Hello, HogeUser!"}

"content"の一部が、デフォルト値の"World"から"HogeUser"に置き換わっています。
また、"id"はリクエストされるたびに1ずつ増えていきます。

◾️レスポンス結果がJSONである事
コントローラクラス(GreetingController)のgreetingメソッドはGreetingオブジェクトを返却していますが、リクエスト結果はJSON形式で返ってきます。特に、JSON形式で返すような指定もしていません。
これはコントローラクラスがPOJO(Plain Old Java Object)のオブジェクトをクライアント側に返却した場合、Spring Bootでは自動的に(裏で)JSON形式に変換してくれるためです。ちなみにこのサンプルアプリでは、JSONライブラリはJacksonが使用されているようです。

◾️ソースコードに色々と変更を加えて試してみる
動作確認までできたので、サンプルのソースコードに手を加えたりして色々と試してみたい方も多いと思います。
ただ、サンプルプロジェクトをインポートした状態ではホットリロード機能が無効になっていますので、アプリ実行中にソースコードに変更を加えても変更がアプリに反映されないので、アプリを再起動し直す必要があります。

ホットリロードを有効にする方法は別ページで説明していますので、そちらを参考にしてください。
Spring Bootプロジェクトのホットリロードを有効にする

次のステップ、Spring Bootでもっと多機能なREST・Web APIサービスを開発する事もできる

簡単でしたが、Spring Bootを使ったRESTサービスのサンプルアプリのソースの解説と動作確認をしてきました。

Spring Bootは高速でアプリ開発ができるという話をよく聞きますが、今回のサンプルアプリを見ても少しのコード量を書くだけでRESTのウェブサービスが作れる事がわかってもらえたと思います。
(*RESTだけではなく、ブラウザ表示のウェブサービスもSpring Boot(Spring MVC)では同じように簡単に作る事ができます。)

ただ、今回はRESTウェブサービスと言っても、GETリクエストのみです。単純なデータ取得をするWeb APIです。
もっと本格的なRESTサービス・Web APIにするには、GETだけでなく、POSTでデータを作れて、PUTでデータを変更できて、DELETEでデータを削除できるサービスを作る必要があると思います。

Spring Bootなら、こうしたGET・POST・PUT・DELETEの機能を要したRESTfulなAPIサービスも開発できますので、仕事や個人で開発を検討している方は、Spring Bootでの開発を候補の1つにしてみてはいかがでしょうか。

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、ビジネス書、マンガ、雑誌などがあります!

その他のSpring Bootの記事

Spring Boot2で日記投稿ウェブアプリ開発入門トップページ
Spring Boot2.3,2.4でシンプルな日記投稿ウェブアプリの開発しながら、入門者・初心者にもわかりやすいように説明しています。DBを使用して、新規投稿、編集、削除、一覧表示という基本的なCRUD機能を備えたアプリです。

Sprint Boot2.3で初めてのJavaのウェブアプリ開発【Eclipse(Pleiades)、macOS版】
【Sprint Boot2】GETリクエストでクライアントからサーバサイドへデータ送信【クエリストリング】
【Sprint Boot2】POSTリクエストでクライアント側からサーバサイドへデータ送信