Type-safe Routing

预计阅读时间:3分钟

Ktor提供了一种以类型化方式创建路由的机制,可用于以下两种方式:构造URL和读取参数.

位置是实验性功能.

目录:

此功能定义在类io.ktor.locations.Locations在神器io.ktor:ktor-locations:$ktor_version .
dependencies { implementation "io.ktor:ktor-locations:$ktor_version" }
dependencies { implementation("io.ktor:ktor-locations:$ktor_version") }
<project> ... <dependencies> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-locations</artifactId> <version>${ktor.version}</version> <scope>compile</scope> </dependency> </dependencies> </project>

Installing the feature

位置功能不需要任何特殊配置:

install(Locations)

Defining route classes

对于要处理的每种类型的路由,您需要创建一个包含要处理的参数的类(通常是数据类).

参数必须是数据转换功能支持的任何类型. 默认情况下,您可以使用IntLongFloatDoubleBooleanString ,enums和Iterable作为参数.

URL parameters

该类必须使用@Location进行注释, @Location指定与大括号{}之间的占位符匹配的路径. 例如: {propertyName} . 花括号之间的名称必须与类的属性匹配.

@Location("/list/{name}/page/{page}")
data class Listing(val name: String, val page: Int)
  • 将匹配: /list/movies/page/10
  • 将构造: Listing(name = "movies", page = 10)

GET parameters

如果您提供的其他类属性不是@Location路径的@Location ,则将从GET的查询字符串或POST参数获取这些参数:

@Location("/list/{name}")
data class Listing(val name: String, val page: Int, val count: Int)
  • 将匹配: /list/movies?page=10&count=20
  • 将构造: Listing(name = "movies", page = 10, count = 20)

Defining route handlers

一旦定义了@Location注释的类 ,此功能构件就会提供用于定义路由处理程序的新类型方法: getoptionsheaderpostputdeletepatch .

routing {
    get<Listing> { listing ->
        call.respondText("Listing ${listing.name}, page ${listing.page}")
    }
}

io.ktor.locations定义的某些带有一个类型参数的通用方法中的io.ktor.locationsio.ktor.routing包中定义的其他方法具有相同的名称. 如果在位置软件包之前导入路由软件包,则IDE可能会建议您对这些方法进行一般化而不是导入正确的软件包. 如果发生这种情况,您可以手动添加import io.ktor.locations.* . 请记住,此API是实验性的. 这个问题已经在github上报道了 .

Building URLs

您可以通过使用带有@Location注释的类的实例调用application.locations.href来构造路由的URL:

val path = application.locations.href(Listing(name = "movies", page = 10, count = 20))

因此,对于此类, path将为"/list/movies?page=10&count=20"" .

@Location("/list/{name}") data class Listing(val name: String, val page: Int, val count: Int)

如果您以这种方式构造URL,并决定更改URL格式,则只需更新@Location路径,这确实很方便.

Subroutes with parameters

您必须创建引用另一个用@Location注释的类的类,并正常注册它们:

routing {
    get<Type.Edit> { typeEdit -> // /type/{name}/edit
        // ...
    }
    get<Type.List> { typeList -> // /type/{name}/list/{page}
        // ...
    }
}

要获得在上级位置中定义的参数,只需要将这些属性名称包括在内部路由的类中. 例如:

@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)
}

by  ICOPY.SITE