$30 off During Our Annual Pro Sale. View Details »

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 竹端 尚人

  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. ご清聴ありがとうございました