Spring BootでRESTfulなWeb Serviceを作るチュートリアルをやってみた

こんにちは!ぐち(@bloguchi)です。

タイトルの通りなんですが、下記のSpringの公式サイトに記載のあるチュートリアルをやってみたのでご紹介します。

前提条件

僕、英語できないんで誤訳とか意味の取り違い、奇想天外な解釈など思いっきり出てくると思いますが、結果的にちゃんと動くので、そういう目で温かく見てくださいね。笑

あくまでも英語なんてからっきしできない社会人がノリと勢いだけで英語のチュートリアルに取り組んでみた戦記だと思って頂ければちょうどかもしれません。(何がちょうどなんだよ)

ちなみにGradleのインストールが完了していることと、環境はMacです。Gradleのインストールがまだの方はHomebrewでさくっとインストールしておいてください。

$ brew install gradle

Homebrewのインストールがまだの方は下記の記事を参考にインストールしてからGradleのインストールをお願いします。

プロジェクトテンプレートを作る

チュートリアルに取り組む前にまずはプロジェクトの雛形(テンプレート)を作りましょう。

こちらからさくっと取得しましょう!

今回はStable版の1.5.6で作成します。ビルド環境はGradleです。言語は今話題のKotlinでもいいですが、ここはJavaで。笑

  • Groupはパッケージ名になります。
  • Artifactはパッケージの最後の名前です。
  • Search for dependenciesWebと入力しSelected Dependenciesに追加しておきます。

最後にGenerate Projectをクリックすればスケルトンといいますか、テンプレートといいますか取得することができます。

IDEにインポート

ダウンロードしてきたプロジェクトをIDEにインポートします。僕は今回IntelliJ IDEAを使います。Eclipseでもさほど変わりはないと思います。

起動画面でImport Projectをクリックします。

写真の通り、Import project from external modelにチェックをつけて、Gradleを選択してNextをクリックします。

画像の通り、初期表示のままFinishをクリックします。

以上で、インポートは完了なので次からいよいよチュートリアルを進めていきます。

やること

サイトだとWhat you’ll buildと冒頭に書かれていますが、直訳だと「あなたができること」ですかね。ようするに完成したら、このチュートリアルではこんなことができますよ。ということですね。

下記のようにHTTPのGETリクエストが送れるようになります。

http://localhost:8080/greeting

レスポンスは下記のようにJSONで受け取ることができます。

{“id”:1,”content”:”Hello, World!”}

また、nameというパラメータを指定して実行することができます。

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

nameをパラメータに指定して実行した場合のレスポンスは下記のようになります。

{“id”:1,”content”:”Hello, User!”}

必要なもの

サイトではWhat you’ll needと書かれています。このチュートリアルの対象みたいなものですね。15分で完了するそうです。笑

JDK1.8以上でGradleかMavenを使っていて、IDEは好きなのでいいよ的な感じですね。

はじめてみる

やーっとですが、進めていきましょう。Build with Gradle.の部分から開始です。

まずはフォルダ階層だったり、build.gradleの内容が紹介されています。冒頭でIntelliJにインポートしたプロジェクトでもbuild.gradleを見ておきましょう。

buildscript {
    ext {
        springBootVersion = '1.5.6.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

クラスを作成する

続きましてCreate a resource representation classです。実際にクラスを追加していきます。

まずはGreeting.javaです。helloフォルダを右クリックしてファイルを追加します。

package com.example.hello;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

続いてGreetingController.javaです。同様にhelloフォルダを右クリックしてファイルを追加します。

package com.example.hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

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

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

続いてサイトではApplication.javaを作成すると記載があるように見えますが、この手順通りに進められているとHelloApplication.javaという実行クラスがあると思いますので、追加は不要です。

実行してみる

ターミナルで./gradlew bootRunを実行しろとサイトに記載がありますので、ターミナル.appを起動・・・しなくてもいいんです!笑

IntelliJ IDEAにはターミナルが内蔵されているのです!!すごいでしょ?では早速IntelliJのターミナルを表示させましょう。

画面左下の灰色のアイコンにカーソルを乗せるとメニューが出てくるので、Terminalをクリックしてください。すると、画面下部にターミナルが表示されるかと思います。

そこで前述のコマンドを実行してみましょう。

$ ./gradlew bootRun

次々とログが表示されますが、驚かずに下記の状態になるまで我慢してくださいね。笑

8080ポートにて実行できたよという内容が表示されているのでhttp://loclahost:8080/greetingにアクセスしてみましょう!冒頭でご説明したようなJSONが表示されれば成功です!めちゃくちゃシンプルですが、RESTful APIの第一歩は完成しました。おめでとうございます。

また冒頭でご紹介したようにnameをパラメータに指定して実行してみてください。表示されるJSON結果が変わるはずなので色々と試してみてください。

では今回はこの辺で。