Slide 1

Slide 1 text

        Kotlin  Ktor 1    Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 2

Slide 2 text

,' ,' ,' ,' , ' ,' +) %" #( • 2019 3!& • *Java  • .- /$ •   –  0 – &  2 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 3

Slide 3 text

         1. Kotlin 2.   3. Ktor  4.  (Routing) 5.  (Locations) 6. Basic! (Authenticaton) 7.  3 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 4

Slide 4 text

% $ % $ % $ % $ % $ % $ 1.Kotlin  # *" →SparkFramework!Java/Kotlin  Java  & Kotlin*"+ Java '()  4 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 5

Slide 5 text

. + . + . + . + . + . + 2.) • Ktor JetBrains*# Web 1.0.02018"11$  (! 1.2.1(2019/5/27) Kotlin)1 %&, 0/ '-Features# 5 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 6

Slide 6 text

       3.Ktor https://start.ktor.io/ 6 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 7

Slide 7 text

       3.Ktor  IntellijKtor    7 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 8

Slide 8 text

       3.Ktor 9  Features Routing Locations Authentication Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 9

Slide 9 text

+ ) + ) + ) + ) + ) + ) 3.Ktor  10 fun main(args: Array) { val server = embeddedServer(Netty, 8080) { this.module(false) } server.start(wait = true) } fun Application.module(testing: Boolean = false) { routing { get("/") { call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain) } } } Application.kt #'! $*"-& ,. "!!!/Netty "/8080 " HELLOWORLD! "%( Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 10

Slide 10 text

       3.Ktor 11 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 11

Slide 11 text

       4.  (Routing) 12 Copyright © 2019 Toranoana Inc. All Rights Reserved.    • /user/{name} {name} 

Slide 12

Slide 12 text

       4.  (Routing) 13 fun Application.module(testing: Boolean = false) { routing { get("/") { call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain) } } get("/user/{name}") { val name = call.parameters["name"] ?: "" call.respondText("Hi! $name") } } http://localhost:8080/user/tora  Hi! tora Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 13

Slide 13 text

      14 Copyright © 2019 Toranoana Inc. All Rights Reserved. 4.(Routing)

Slide 14

Slide 14 text

       5.  (Locations) 15 Copyright © 2019 Toranoana Inc. All Rights Reserved.    • /type/{name} • /type/{name}/edit • /type/{name}/list/{page} type   

Slide 15

Slide 15 text

       5.  (Locations) 16 fun Application.module(testing: Boolean = false) { install(Locations) { } routing { // Register nested routes get { type -> call.respondText("Inside $type") } get { edit -> call.respondText("Inside $edit") } get { list -> call.respondText("Inside $list") } } } @Location("/type/{name}") data class Type(val name: String) { @Location("/edit") data class Edit(val type: Type) @Location("/list/{page}") data class List(val type: Type, val page: Int) } http://localhost:8080/type/tora     Type Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 16

Slide 16 text

       17 fun Application.module(testing: Boolean = false) { install(Locations) { } routing { // Register nested routes get { type -> call.respondText("Inside $type") } get { edit -> call.respondText("Inside $edit") } get { list -> call.respondText("Inside $list") } } } @Location("/type/{name}") data class Type(val name: String) { @Location("/edit") data class Edit(val type: Type) @Location("/list/{page}") data class List(val type: Type, val page: Int) } http://localhost:8080/type/tora    Type Copyright © 2019 Toranoana Inc. All Rights Reserved. 5.  (Locations)

Slide 17

Slide 17 text

       18 Type  nametora Copyright © 2019 Toranoana Inc. All Rights Reserved. 5.  (Locations)

Slide 18

Slide 18 text

       19 fun Application.module(testing: Boolean = false) { install(Locations) { } routing { // Register nested routes get { type -> call.respondText("Inside $type") } get { edit -> call.respondText("Inside $edit") } get { list -> call.respondText("Inside $list") } } } @Location("/type/{name}") data class Type(val name: String) { @Location("/edit") data class Edit(val type: Type) @Location("/list/{page}") data class List(val type: Type, val page: Int) } NestLocation  /type/{name}/edit /type/{name}/list/{page} 5.   (Locations)

Slide 19

Slide 19 text

       20 Edit  List  Copyright © 2019 Toranoana Inc. All Rights Reserved. 5.   (Locations)

Slide 20

Slide 20 text

'# '# '# '# ' # '# 6.Basic*)(Authenticaton) 21 fun Application.module(testing: Boolean = false) { install(Authentication) { basic(name = "myauth1") { realm = "Ktor Server" validate { credentials -> if (credentials.name == credentials.password) { UserIdPrincipal(credentials.name) } else { null } } } } ( $) ($) routing { authenticate("myauth1") { get("/basic") { val principal = call.authentication.principal() call.respondText("Hi ${principal?.name ?: ""}", contentType = ContentType.Text.Plain) } } } } *)! +myauth1 valiate *)!"%+ name password&( &   Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 21

Slide 21 text

!  !  !  !  !  !  22 fun Application.module(testing: Boolean = false) { install(Authentication) { basic(name = "myauth1") { realm = "Ktor Server" validate { credentials -> if (credentials.name == credentials.password) { UserIdPrincipal(credentials.name) } else { null } } } } ( ) ( ) routing { authenticate("myauth1") { get("/basic") { val principal = call.authentication.principal() call.respondText("Hi ${principal?.name ?: ""}", contentType = ContentType.Text.Plain) } } } } http://localhost:8080/basic  Basic#"  #"$ #"   Copyright © 2019 Toranoana Inc. All Rights Reserved. 6.Basic#"(Authenticaton)

Slide 22

Slide 22 text

       23 Copyright © 2019 Toranoana Inc. All Rights Reserved. 6.Basic(Authenticaton)

Slide 23

Slide 23 text

= : = : = : = : = : = : 7.  • Intellij Ktor#%( Ktor#' 6; • &)( 29A – ()! Routing – )%,8Locations "%$ .40 /5+7*> )%31Validation-< • @? Features82 24 Copyright © 2019 Toranoana Inc. All Rights Reserved.

Slide 24

Slide 24 text

          25 Copyright © 2019 Toranoana Inc. All Rights Reserved.