Ktorコトハジメ

 Ktorコトハジメ

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

D1531f9547e24397c7e85881fac03096?s=128

Takehata Naoto

November 29, 2018
Tweet

Transcript

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

  2. 自己紹介

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

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

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

  6. 1.Ktorとは?

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

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

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

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

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

  12. でもKotlin製使いたい

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

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

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

  16. 最初のAPI

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

  18. Hello World! fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args) fun Application.module()

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

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

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

  22. routing routing { get("/json") { call.respond(mapOf("status" to "OK")) } }

    call.respondでレスポンスを返却すればJsonになる
  23. •  使いたい機能に応じてinstallブロックを書き、設定を記述する •  機能を使いたい時は、gradleへの依存関係の追加、installで設定等を 追加するのが基本

  24. APIの実装

  25. Request、Response // リクエスト
 data class SampleRequest(val id: Int) // レスポンス


    data class SampleResponse(val id: Int, val name: String) ただのデータクラス(Swaggerとかで作れるやつで問題なし)
  26. routing post("/json") { val request = call.receive<SampleRequest>() val response =

    SampleResponse(request.id, "ktor") call.respond(response) } call.receive<リクエストの型>()でJSONのリクエストを受け取る
  27. これだけ

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

  29. Basic認証の実装

  30. install install(Authentication) { basic { validate { if (it.name ==

    "user" && it.password == "password") UserIdPrincipal("name") else null } } } ① ①Basic認証を有効化 ② ②validateブロックで認証のチェック、セッション情報のセット(UserIdPrincipalのとこ)
  31. routing authenticate { get("/auth") { call.respondText("Authenticated!!") } } authenticateブロックで囲われたAPIにアクセスすると、Basic認証が走る

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

  33. module authenticate { get("/auth") { val user = call.authentication.principal<UserIdPrincipal>() call.respondText(user!!.name)

    } } Call.authentication.principal<Principalの型>でセッションに保持している ユーザー情報を取得できる
  34. Principal data class User(val id: Int, val name: String) :

    Principal io.ktor.auth.Principalを実装していればPrincipalとして使える
  35. 4.その他のできること

  36. •  OAuth •  Http Client •  WebSockets •  非同期通信 • 

    Autoreload •  実行可能Jar •  Logging etc… 今回触れなかった機能たち
  37. とりあえず色々できる

  38. 5.まとめと感想

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

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

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