Help us understand the problem. What is going on with this article?

サーバーサイドをKotlinではじめてみた

4年ほどPHPユーザーでしたが、ふと思い立ってKotlinにトライしてみようと思いました。
個人的メモも兼ねて。
ちなみに手元の環境は MacBook Pro(2017年モデル/RAM16GB/High Sierra 10.13) です。

やりたいこと

  • 開発環境の構築
  • Hello World的な何か
  • 最終的にはRESTfulなAPIを構築したい

環境構築

JDKとかエディタとか導入していきます。

1.エディタ

今までATOMとかVSCodeをゴリゴリ使っていましたが、IDE使いたいなぁと思ったので定番のIntelliJ IDEAを採用!
https://www.jetbrains.com/idea/download/ にアクセスするとUltimate版とCommunity版があります。DBツールとかJS/TSツールも導入されているUltimate版にしました。どうやら30日間の無料試用期間があるみたいなのでイマイチだったらそこでやめればいいかなぁと。

インストールは基本的にYes連呼していれば良さげですが、Tune IDEA to your tasksの画面で下へスクロールすると、DBツールがDisableになっていたのでこれをEnableにしました。

2.JDK

他でJavaを扱う機会があったため、手元では既にJDK1.8を導入済みでした...。
こちらの公式サイトからダウンロードできます。

Hello World的な何か

Spring Bootを用いて超簡単なAPIを立てます。

1.ひな形の作成

まず https://start.spring.io/ でひな形を作成します。
スクリーンショット 2018-08-17 17.44.49.png
こんな感じで入力。(Project Metadataは自分に合わせた内容で。)
Generate Projectを押すとZipファイルがDLされるのでこれを解凍します。

2.IntelliJ IDEAで読み込む

IntelliJ IDEAを早速起動します。
スクリーンショット 2018-08-17 17.32.03.png
【Open】を選択し、先ほど解凍したディレクトリを選び、完了です!簡単。

3.Controllerの作成

スクリーンショット 2018-08-17 17.52.57.png
この位置にKotlin Class Fileを新規作成します。
スクリーンショット 2018-08-17 17.52.43.png
こんな感じ。

WelcomeController.kt
package me.icetea.helloworld

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping

@RestController
@RequestMapping("hello")
class HelloController {
    @GetMapping("")
    fun index(): String {
        return "Hello World!!"
    }
}
  • @RestControllerアノテーションは@Controllerアノテーションと異なり、直接コンテンツを配信します。
  • @RequestMapping("hoge")でルーティングを実装しています。@GetMappingはGETリクエスト限定のアノテーションで、可読性向上のために用いています。

4.Webサーバー起動

IntelliJ IDEAのTerminalで./gradlew clean bootRunを実行するとWebサーバーが起動します。http://localhost:8080/helloにアクセスしてHello World!!と表示されていれば成功です!!

(RESTfulな)API

APIを構築するために、先ほどのControllerにJSONを返すメソッドを追加します。

1.Modelの作成

今回は要素として名前とメールアドレスを持つUserというModelを作成します。
スクリーンショット 2018-08-17 18.42.38.png

User.kt
package me.icetea.helloworld.Model

import javax.validation.constraints.NotBlank

data class User(
        @field:NotBlank val name: String = "",
        @field:NotBlank val email: String = "",
        @field:NotBlank val registered: Boolean = (name.isNotEmpty() && email.isNotEmpty())
)

@fieldアノテーションでバリデーションを実装しています。

2.Controllerの修正

WelcomeController.kt
package me.icetea.helloworld

import me.icetea.helloworld.Model.User
import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/hello")
class HelloController {
    @GetMapping("")
    fun index() = "Hello World!!"

    @PostMapping("/post/user", consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE])
    fun receiveUser(@RequestParam body: Map<String, String>) = User(body["name"] ?: "", body["email"] ?: "")
}

@PostMapping("/post/user", consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE])とすることで、/hello/post/userにform-urlencodedでPOSTできるようになります。
またこのパラメータはMap型で受け取ります。

【補足】
Kotlinには三項演算子がない代わりにif文を式として扱えるので
var hoge: String = (if(fmfm !== null) fmfm!! else "Text")
のような書き方になっています。

KotlinではNullableな型に対してエルビス演算子:?でNullチェックを行うことができます。

4.Webサーバー起動&テスト

./gradlew clean bootRunを再び実行してWebサーバーを再起動します。http://localhost:8080/hello/post/userにnameとemailをPOSTしてみましょう。
今回はPostmanというソフトを利用しています。簡単にAPIが試せるので重宝します。

スクリーンショット 2018-08-17 18.59.15.png
このように表示されれば正しく実装できました!!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away