More Related Content
PDF
【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた PDF
【虎の穴ラボLT】非エンジニアにGASを教えた話(とらラボTech conference) PDF
20210528 aws arm_ugokasitemita PDF
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発 PDF
通販開発部の西田さん「通販開発マネジメントの5ルール」 PDF
【20211027_toranoana.deno#2】とりあえずDenoを CloudRunで動かしてみる PDF
PDF
What's hot
PDF
PDF
PDF
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 PDF
Gas+twitter apiでtwitterのお気に入り画像保存を自動化してみた PDF
0から1へ、1からその先の未来へ!とらのあなラボのエンジニア採用 PDF
PDF
PDF
今まで公開してきた Deno Third Party Modules -- Deno での WebAssembly の利用の話 -- PDF
PDF
オタクエンジニアを熱くさせる!モチベーションと効率をあげるチームビルディング_20210611_TechDay#1_3 PDF
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた! PDF
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング PDF
PDF
PDF
PDF
PDF
[X-Tech] アニメ・漫画 企業でITを活用してオタク業界の未来を変える取り組み (Anitech) PDF
PDF
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント PDF
More from 虎の穴 開発室
PDF
PDF
PDF
PDF
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf PDF
toranoana.deno #6 アジェンダ 採用説明 PDF
Deno 向け WEB 開発用のツールを作ったので 紹介します PDF
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 – PDF
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと PDF
PDF
セキュリティを強化しよう!CloudArmorの機能解説 PDF
PDF
PDF
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について PDF
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る PDF
【20220120 toranoana.deno#4】denoでffiの続き PDF
PDF
【20211202_toranoana.deno#3】denoでFFI PDF
PDF
【コードレビューLT資料】コード規約の策定会を実施した話 PPTX
ワーケーションを 体験してみて〜富山 ワーケーションモニターツアーに参加しました Recently uploaded
PDF
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup PDF
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2 PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと... PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1 PPTX
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool サーバサイドKotlinへの入門 Ktor編
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
6
Copyright © 2019Toranoana Inc. All Rights Reserved.
● Featuresと呼ばれるHTML Template、認証機
能などの各種機能をプラグイン形式で追加が
可能
● 非同期処理を行うサーバの開発を容易にでき
る
● 標準のサーブレットエンジンの他に、Jetty、
Nettyなどのサーブレットエンジンと差し替え可
能
2.Ktorについて
- 7.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
7
Copyright © 2019Toranoana Inc. All Rights Reserved.
● Featuresと呼ばれるHTML Template、認証機
能などの各種機能をプラグイン形式で追加が
可能
● 非同期処理を行うサーバの開発を容易にでき
る
● 標準のサーブレットエンジンの他に、Jetty、
Nettyなどのサーブレットエンジンと差し替え可
能
2.Ktorについて
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
15
Copyright © 2019Toranoana Inc. All Rights Reserved.
2.Ktorプロジェクトの作成手順
3.事前準備
「Project name」を入
力すると「Project
location」(プロジェクト
のディレクトリの作成
場所)が自動的に変更
されます。内容を確認
後、「Finish」ボタンをク
リックします。
1. Project name を入力
2. Finishボタンをクリック
- 16.
- 17.
- 18.
- 19.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
19
Copyright © 2019Toranoana Inc. All Rights Reserved.
Routing
4.Features
import io.ktor.routing.*
(中略)
routing {
get("/") {
call.respondText("HELLO WORLD!", contentType =
ContentType.Text.Plain)
}
get("/html-dsl") {
call.respondHtml {
(中略)
}
}
(以下略)
- 20.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
20
Copyright © 2019Toranoana Inc. All Rights Reserved.
Routing
4.Features
import io.ktor.routing.*
(中略)
routing {
get("/") {
call.respondText("HELLO WORLD!", contentType =
ContentType.Text.Plain)
}
get("/html-dsl") {
call.respondHtml {
(中略)
}
}
(以下略)
構造化ルートと関連するハンドラを定義す
ることができます。
つまり、リクエストを受け付けるURLと、そ
れに対するアクションを指定できるように
なります。
Locations というFeaturesを利用すること
で、タイプセーフなURLパラメータを扱うこ
とも可能です。
- 21.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
21
Copyright © 2019Toranoana Inc. All Rights Reserved.
HTML DSL
4.Features
get("/html-dsl") {
call.respondHtml {
head {
link(rel = "stylesheet", href = "/styles.css", type = "text/css")
}
body {
h1 { +"HTML" }
ul {
for (n in 1..10) {
li { +"$n" }
}
}
p("myclass") {
+"I am using myclass"
}
}
}
}
Kotlinのコードを使用してHTMLを
生成できるようになります。
- 22.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
22
Copyright © 2019Toranoana Inc. All Rights Reserved.
CSS DSL
4.Features
get("/styles.css") {
call.respondCss {
body {
backgroundColor = Color.red
}
p {
fontSize = 2.em
}
rule("p.myclass") {
color = Color.blue
}
}
}
Kotlinのコードを使用してCSSを生
成できるようになります。
- 23.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
23
Copyright © 2019Toranoana Inc. All Rights Reserved.
StatusPages
4.Features
install(StatusPages) {
exception<AuthenticationException> { cause ->
call.respond(HttpStatusCode.Unauthorized)
}
exception<AuthorizationException> { cause ->
call.respond(HttpStatusCode.Forbidden)
}
}
class AuthenticationException : RuntimeException()
class AuthorizationException : RuntimeException()
例外が発生した際のアクションを
定義できるようになります。
- 24.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
24
Copyright © 2019Toranoana Inc. All Rights Reserved.
Sessions
4.Features
install(Sessions) {
cookie<MySession>("MY_SESSION") {
cookie.extensions["SameSite"] = "lax"
}
}
get("/session/increment") {
val session = call.sessions.get<MySession>() ?: MySession()
call.sessions.set(session.copy(count = session.count + 1))
call.respondText("Counter is ${session.count}. Refresh to increment.")
}
data class MySession(val count: Int = 0)
- 25.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
25
Copyright © 2019Toranoana Inc. All Rights Reserved.
Sessions
4.Features
install(Sessions) {
cookie<MySession>("MY_SESSION") {
cookie.extensions["SameSite"] = "lax"
}
}
get("/session/increment") {
val session = call.sessions.get<MySession>() ?: MySession()
call.sessions.set(session.copy(count = session.count + 1))
call.respondText("Counter is ${session.count}. Refresh to increment.")
}
data class MySession(val count: Int = 0)
セッションのサポートを追加しま
す。
- 26.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
26
Copyright © 2019Toranoana Inc. All Rights Reserved.
Static Content
4.Features
// Static feature. Try to access `/static/ktor_logo.svg`
static("/static") {
resources("static")
}
定義された場所から静的ファイル
を配信します。
左記のようなコードの場合、
/static/ktor_logo.svg を指定され
ると/resources/static/
ktor_logo.svg を求めます。
- 27.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
27
Copyright © 2019Toranoana Inc. All Rights Reserved.
Freemarker
4.Features
install(FreeMarker) {
templateLoader = ClassTemplateLoader(this::class.java.classLoader,
"templates")
}
get("/html-freemarker") {
call.respond(FreeMarkerContent("index.ftl", mapOf("data" to
IndexData(listOf(1, 2, 3))), ""))
} レスポンスとして、
FreeMarkerContent に指定され
たテンプレートindex.ftiと、mapOf
データを渡しています。
- 28.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
28
Copyright © 2019Toranoana Inc. All Rights Reserved.
Freemarker
4.Features
<#-- @ftlvariable name=“data” type=“com.example.IndexData” -->
<html>
<body>
<ul>
<#list data.items as item>
<li>${item}</li>
</#list>
</ul>
</body>
</html>
(index.fti)
- 29.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
29
Copyright © 2019Toranoana Inc. All Rights Reserved.
CORS
4.Features
install(CORS) {
method(HttpMethod.Options)
method(HttpMethod.Put)
method(HttpMethod.Delete)
method(HttpMethod.Patch)
header(HttpHeaders.Authorization)
header("MyCustomHeader")
allowCredentials = true
anyHost() // @TODO: Don't do this in production if possible. Try to limit it.
}
オリジン間リソース共有(CORS)
を有効にする為の設定が行えま
す。
(HTTPメソッドの追加、ヘッダーの
追加等)
- 30.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
30
Copyright © 2019Toranoana Inc. All Rights Reserved.
Jackson
4.Features
install(ContentNegotiation) {
jackson {
enable(SerializationFeature.INDENT_OUTPUT)
}
}
get("/json/jackson") {
call.respond(mapOf("hello" to "world"))
}
Jacksonライブラリを使用して
JSONのシリアル化を処理します。
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
36
Copyright © 2019Toranoana Inc. All Rights Reserved.
・サーバーは新規のKtorプロジェクトで、Features
にRoutingだけを指定して作成したものを、そのま
ま使用します。
7.実践
fun main(args: Array<String>): Unit =
io.ktor.server.netty.EngineMain.main(args)
@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
routing {
get("/") {
call.respondText("HELLO WORLD!", contentType =
ContentType.Text.Plain)
}
}
}
- 37.
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
37
Copyright © 2019Toranoana Inc. All Rights Reserved.
・クライアント側はKotlinのコルーチンを使用して作
成した非常に簡単なものです。
7.実践
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
repeat(100) {
launch {
val result : = clientCall()
println("$result")
}
}
}
fun clientCall(): String {
val requestUrl = "http://127.0.0.1:8080/"
- 38.