型安全なリクエスト
必須の依存関係: io.ktor:ktor-client-resources
Ktor は、型安全なリクエストを実装できる Resources
プラグインを提供します。これを実現するには、サーバー上で利用可能なリソースを記述するクラスを作成し、そのクラスを@Resource
キーワードでアノテーションする必要があります。なお、@Resource
アノテーションは、kotlinx.serializationライブラリが提供する@Serializable
の振る舞いを持つことに注意してください。
Ktor サーバーは、型安全なルーティングを実装する機能を提供します。
依存関係を追加する
kotlinx.serializationを追加する
リソースクラスが@Serializable
の振る舞いを持つべきであることを考慮すると、セットアップセクションで説明されているように、Kotlin serialization プラグインを追加する必要があります。
Resources の依存関係を追加する
Resources
を使用するには、ビルドスクリプトに ktor-client-resources
アーティファクトを含める必要があります。
Ktor クライアントに必要なアーティファクトの詳細については、
Resources をインストールする
Resources
をインストールするには、クライアント設定ブロック内で install
関数に渡します。
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.resources.*
//...
val client = HttpClient(CIO) {
install(Resources)
}
リソースクラスを作成する
各リソースクラスには@Resource
アノテーションが必要です。 以下では、単一のパスセグメント、クエリパラメーター、パスパラメーターなどを定義するリソースクラスのいくつかの例を見ていきます。
リソースURL
以下の例は、/articles
パスに応答するリソースを指定する Articles
クラスを定義する方法を示しています。
import io.ktor.resources.*
@Resource("/articles")
class Articles()
クエリパラメーターを持つリソース
以下の Articles
クラスには、クエリパラメーターとして機能する sort
文字列プロパティがあり、sort
クエリパラメーターを持つ以下のパスに応答するリソースを定義できます: /articles?sort=new
。
@Resource("/articles")
class Articles(val sort: String? = "new")
ネストされたクラスを持つリソース
複数のパスセグメントを含むリソースを作成するために、クラスをネストできます。この場合、ネストされたクラスは外部クラス型のプロパティを持つ必要があることに注意してください。 以下の例は、/articles/new
パスに応答するリソースを示しています。
@Resource("/articles")
class Articles() {
@Resource("new")
class New(val parent: Articles = Articles())
}
パスパラメーターを持つリソース
以下の例は、パスセグメントにマッチし、id
という名前のパラメーターとしてキャプチャするネストされた {id}
整数パスパラメーターを追加する方法を示しています。
@Resource("/articles")
class Articles() {
@Resource("{id}")
class Id(val parent: Articles = Articles(), val id: Long)
}
例として、このリソースは/articles/12
に応答するために使用できます。
例: CRUD操作のためのリソース
上記の例をまとめ、CRUD操作のための Articles
リソースを作成しましょう。
@Resource("/articles")
class Articles() {
@Resource("new")
class New(val parent: Articles = Articles())
@Resource("{id}")
class Id(val parent: Articles = Articles(), val id: Long) {
@Resource("edit")
class Edit(val parent: Id)
}
}
このリソースは、すべての記事をリスト表示したり、新しい記事を投稿したり、編集したりするために使用できます。このリソースへの型安全なリクエストを作成する方法については、次のセクションで説明します。
完全な例はこちらで見つけることができます: client-type-safe-requests。
型安全なリクエストを作成する
型付きリソースへリクエストを作成するには、リソースクラスのインスタンスをリクエスト関数(request
、get
、post
、put
など)に渡す必要があります。たとえば、以下のサンプルは/articles
パスへのリクエストを作成する方法を示しています。
@Resource("/articles")
class Articles()
fun main() {
runBlocking {
val client = HttpClient(CIO) {
install(Resources)
// ...
}
val getAllArticles = client.get(Articles())
}
}
以下の例は、例: CRUD操作のためのリソースで作成された Articles
リソースへの型付きリクエストを作成する方法を示しています。
fun main() {
defaultServer(Application::module).start()
runBlocking {
val client = HttpClient(CIO) {
install(Resources)
defaultRequest {
host = "0.0.0.0"
port = 8080
url { protocol = URLProtocol.HTTP }
}
}
val getAllArticles = client.get(Articles())
val newArticle = client.get(Articles.New())
val postArticle = client.post(Articles()) { setBody("Article content") }
val getArticle = client.get(Articles.Id(id = 12))
val editArticlePage = client.get(Articles.Id.Edit(Articles.Id(id = 12)))
val putArticle = client.put(Articles.Id(id = 12)) { setBody("New article content") }
val deleteArticle = client.delete(Articles.Id(id = 12))
}
defaultRequest関数は、すべてのリクエストに対するデフォルトのURLを指定するために使用されます。
完全な例はこちらで見つけることができます: client-type-safe-requests。