Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ktorコトハジメ

 Ktorコトハジメ

2018年11月29日(木) 筋肉.ktの発表資料です。

Takehata Naoto

November 29, 2018
Tweet

More Decks by Takehata Naoto

Other Decks in Technology

Transcript

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

    View Slide

  2. 自己紹介

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. 1.Ktorとは?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. 人の名前みたい
    けいた

    View Slide

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

    View Slide

  12. でもKotlin製使いたい

    View Slide

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

    View Slide

  14. 2.REST APIを作ってみる

    View Slide

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

    View Slide

  16. 最初のAPI

    View Slide

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

    View Slide

  18. 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とかが入る単位

    View Slide

  19. JSONを使う

    View Slide

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

    View Slide

  21. install
    install(ContentNegotiation) {
    jackson {
    // ここに設定を書ける

    }
    }
    installブロックで追加するKtorモジュールや設定を記述する

    View Slide

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

    View Slide

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

    View Slide

  24. APIの実装

    View Slide

  25. Request、Response
    // リクエスト

    data class SampleRequest(val id: Int)
    // レスポンス

    data class SampleResponse(val id: Int, val name: String)
    ただのデータクラス(Swaggerとかで作れるやつで問題なし)

    View Slide

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

    View Slide

  27. これだけ

    View Slide

  28. 3.認証を入れてみる

    View Slide

  29. Basic認証の実装

    View Slide

  30. install
    install(Authentication) {
    basic {
    validate {
    if (it.name == "user" && it.password == "password") UserIdPrincipal("name")
    else null
    }
    }
    }

    ①Basic認証を有効化

    ②validateブロックで認証のチェック、セッション情報のセット(UserIdPrincipalのとこ)

    View Slide

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

    View Slide

  32. セッション情報の利用

    View Slide

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

    View Slide

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

    View Slide

  35. 4.その他のできること

    View Slide

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

    View Slide

  37. とりあえず色々できる

    View Slide

  38. 5.まとめと感想

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide