Sprint Bootの入門ページです。Spring Bootを使ったRESTサービスのサンプルアプリのソースコードの解説と動作確認をしています。Spring Bootを初めて学習しようと考えている初心者・入門者の方は、参考にしてください。
※ 本ページはプロモーションが含まれています。
以前にSpringの入門ガイド用のサンプルプロジェクトをEclipseからインポートして動作確認などをしました。
Spring Bootの入門用サンプルプロジェクトをEclipseにインポートして動かしてみる
今回は、インポートしたSpring BootのRESTのウェブサービスのソースコードを見たり、動作確認などもしてみたいと思います。
・開発環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
->Webアプリ内の話なのでWindowsでも同じかと思います。
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
Spring Boot:バージョン2.7.1(2022/11/22時点)
◾️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版】
◾️Spring BootのRESTサービスのサンプルアプリについて
ここからは、Spring BootのRESTサービスのサンプルアプリ(Rest Service)をEclipseにインポートしている前提で話を進めます。
最初に書きましたが、サンプルアプリのインポートについては別ページで説明していますので、そちらを参考にしてください。
Spring Bootの入門用サンプルプロジェクトをEclipseにインポートして動かしてみる
アプリのインポートだけでなく、アプリの動作確認やインポート時には無効になっているホットリロード機能を有効にする方法なども説明しています。
また、RESTとは何か?RESTについてはこちらのサイトの解説が解りやすいと思います。
REST【Representational State Transfer】とは?
今回インポートしたサンプルアプリ(Rest Service)は、とてもシンプルな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サービスのサンプルアプリのソースの解説と動作確認をしてきました。
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はWeb APIだけでなく、通常のWebサイト(Webサプリ)の開発にもよく使用されるWebフレームワークです。別ページでSpring Bootを使ったシンプルな日記投稿Webアプリの開発を開発しながら、入門者・初心者にもわかりやすいように説明しているので、よければ参考にしてください。DBと連携した新規投稿、編集、削除、一覧表示という基本的なCRUD機能を備えたアプリです。
Spring Boot2で日記投稿ウェブアプリ開発入門トップページ