Slide 1

Slide 1 text

Ktorコトハジメ 2018年11月29日 筋肉.kt 竹端 尚人

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

概要 氏名:竹端 尚人 Twitter:@n_takehata 株式会社アプリボット所属 ・サーバーサイドKotlin ・スマートフォンゲーム開発 ・エンジニアは11年ほど ・元公務員

Slide 4

Slide 4 text

筋肉について • 週2でランニング(水曜日は帰宅ラン) • 女の子には「いい体」とよく言われる

Slide 5

Slide 5 text

アジェンダ 1.Ktorとは? 2.REST APIを作ってみる 3.認証を入れてみる 4.その他のできること 5.まとめと感想

Slide 6

Slide 6 text

1.Ktorとは?

Slide 7

Slide 7 text

Kotlin製のWeb?フレームワーク 先日バージョン1.0がリリース

Slide 8

Slide 8 text

今週も話題に Kotlin用フレームワーク「Ktor 1.0」正式リリース。 非同期処理に対応したWebサーバとマルチプ ラットフォームなクライアントの開発に対応 https://www.publickey1.jp/blog/18/ kotlinktor_10web.html

Slide 9

Slide 9 text

特徴 ・非同期処理を容易に実装できる ・Netty、Jetty、Tomcatなどのサーブレットエンジ ンに対応 ・JSONシリアライゼーション、ユーザ認証をはじ めとした様々な標準機能を搭載 ・「ケイター」と読む

Slide 10

Slide 10 text

人の名前みたい けいた

Slide 11

Slide 11 text

サーバーサイドKotlinのフレームワークといえば •  現状はSpringほぼ一択 •  Javaでのシェアが圧倒的に高い上、フレームワーク側もKotlin 対応を始めている •  多機能ですごくいいフレームワーク

Slide 12

Slide 12 text

でもKotlin製使いたい

Slide 13

Slide 13 text

ということでKtor触ってみました

Slide 14

Slide 14 text

2.REST APIを作ってみる

Slide 15

Slide 15 text

手順はブログに書いてるので参考にしてください Ktorはどう使う? https://www.takehata-engineer.com/entry/how-about-using-ktor

Slide 16

Slide 16 text

最初のAPI

Slide 17

Slide 17 text

IntelliJ IDEAのKtorプラグインが楽 Ktorプロジェクトを作ればGradleの設定とか諸々やってくれる

Slide 18

Slide 18 text

Hello World! fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args) fun Application.module() { routing { get("/") { call.respondText("Hello World!") } } } ①メイン関数でNettyサーバーの起動 ① ② ③ ③routingブロックでルーティングしていわゆるController的な処理を書く ②Application.module()が実行されるAPIとかが入る単位

Slide 19

Slide 19 text

JSONを使う

Slide 20

Slide 20 text

gradleへの設定追加 dependencies { compile "io.ktor:ktor-jackson:$ktor_version" } KtorのJacksonモジュールの依存関係を追加

Slide 21

Slide 21 text

install install(ContentNegotiation) { jackson { // ここに設定を書ける
 } } installブロックで追加するKtorモジュールや設定を記述する

Slide 22

Slide 22 text

routing routing { get("/json") { call.respond(mapOf("status" to "OK")) } } call.respondでレスポンスを返却すればJsonになる

Slide 23

Slide 23 text

•  使いたい機能に応じてinstallブロックを書き、設定を記述する •  機能を使いたい時は、gradleへの依存関係の追加、installで設定等を 追加するのが基本

Slide 24

Slide 24 text

APIの実装

Slide 25

Slide 25 text

Request、Response // リクエスト
 data class SampleRequest(val id: Int) // レスポンス
 data class SampleResponse(val id: Int, val name: String) ただのデータクラス(Swaggerとかで作れるやつで問題なし)

Slide 26

Slide 26 text

routing post("/json") { val request = call.receive() val response = SampleResponse(request.id, "ktor") call.respond(response) } call.receive<リクエストの型>()でJSONのリクエストを受け取る

Slide 27

Slide 27 text

これだけ

Slide 28

Slide 28 text

3.認証を入れてみる

Slide 29

Slide 29 text

Basic認証の実装

Slide 30

Slide 30 text

install install(Authentication) { basic { validate { if (it.name == "user" && it.password == "password") UserIdPrincipal("name") else null } } } ① ①Basic認証を有効化 ② ②validateブロックで認証のチェック、セッション情報のセット(UserIdPrincipalのとこ)

Slide 31

Slide 31 text

routing authenticate { get("/auth") { call.respondText("Authenticated!!") } } authenticateブロックで囲われたAPIにアクセスすると、Basic認証が走る

Slide 32

Slide 32 text

セッション情報の利用

Slide 33

Slide 33 text

module authenticate { get("/auth") { val user = call.authentication.principal() call.respondText(user!!.name) } } Call.authentication.principalでセッションに保持している ユーザー情報を取得できる

Slide 34

Slide 34 text

Principal data class User(val id: Int, val name: String) : Principal io.ktor.auth.Principalを実装していればPrincipalとして使える

Slide 35

Slide 35 text

4.その他のできること

Slide 36

Slide 36 text

•  OAuth •  Http Client •  WebSockets •  非同期通信 •  Autoreload •  実行可能Jar •  Logging etc… 今回触れなかった機能たち

Slide 37

Slide 37 text

とりあえず色々できる

Slide 38

Slide 38 text

5.まとめと感想

Slide 39

Slide 39 text

•  導入は割と簡単 •  動作が軽量 •  標準機能だけでWebサービス作れそうなくらいの機能はある •  Kotlin製フレームワーク触るの楽しい(気持ちの問題)

Slide 40

Slide 40 text

今後選択肢に入れていきたい

Slide 41

Slide 41 text

ご清聴ありがとうございました