Ktorクライアントにおけるコンテンツネゴシエーションとシリアライズ
必須の依存関係: io.ktor:ktor-client-content-negotiation
コード例: client-json-kotlinx
ContentNegotiationプラグインは、主に2つの目的を果たします。
- クライアントとサーバー間でメディアタイプをネゴシエートすること。これには
Accept
およびContent-Type
ヘッダーを使用します。 - リクエスト送信時およびレスポンス受信時に、コンテンツを特定の形式でシリアライズ/デシリアライズすること。Ktorは、JSON、XML、CBOR、ProtoBufといった形式をすぐに使用できるようにサポートしています。XMLシリアライザーはJVMでのみサポートされていることに注意してください。
サーバー側では、Ktorはコンテンツのシリアライズ/デシリアライズのためにContentNegotiationプラグインを提供しています。
依存関係の追加
ContentNegotiation
ContentNegotiation
を使用するには、ビルドスクリプトにktor-client-content-negotiation
アーティファクトを含める必要があります。
Ktorクライアントに必要なアーティファクトの詳細については、「
特定の形式のシリアライザーには追加のアーティファクトが必要であることに注意してください。例えば、kotlinx.serializationはJSONのためにktor-serialization-kotlinx-json
依存関係を必要とします。含まれるアーティファクトに応じて、Ktorはデフォルトのシリアライザーを自動的に選択します。必要であれば、シリアライザーを明示的に指定して設定できます。
シリアライズ
kotlinx.serializationコンバーターを使用する前に、セットアップセクションで説明されているように、Kotlin serializationプラグインを追加する必要があります。
JSON
JSONデータをシリアライズ/デシリアライズするには、kotlinx.serialization、Gson、Jacksonのいずれかのライブラリを選択できます。
ビルドスクリプトにktor-serialization-kotlinx-json
アーティファクトを追加します。
ビルドスクリプトにktor-serialization-gson
アーティファクトを追加します。
ビルドスクリプトにktor-serialization-jackson
アーティファクトを追加します。
XML
XMLをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-xml
を追加します。
jsNode
ターゲットではXMLシリアライズがサポートされていないことに注意してください。
CBOR
CBORをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-cbor
を追加します。
ProtoBuf
ProtoBufをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-protobuf
を追加します。
ContentNegotiationのインストール
ContentNegotiation
をインストールするには、クライアント設定ブロック内でinstall
関数に渡します。
val client = HttpClient(CIO) {
install(ContentNegotiation)
}
これで、必要なJSONシリアライザーを設定できます。
シリアライザーの設定
JSONシリアライザー
アプリケーションにJSONシリアライザーを登録するには、json
メソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
json()
}
}
json
コンストラクターでは、例えば以下のようにJsonBuilder APIにアクセスできます。
val client = HttpClient(CIO) {
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
})
}
}
完全な例はclient-json-kotlinxにあります。
アプリケーションにGsonシリアライザーを登録するには、gsonメソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.gson.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
gson()
}
}
gson
メソッドを使用すると、GsonBuilderによって提供されるシリアライズ設定を調整することもできます。
アプリケーションにJacksonシリアライザーを登録するには、jacksonメソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.jackson.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
jackson()
}
}
jackson
メソッドを使用すると、ObjectMapperによって提供されるシリアライズ設定を調整することもできます。
XMLシリアライザー
アプリケーションにXMLシリアライザーを登録するには、xml
メソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.xml.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
xml()
}
}
xml
メソッドを使用すると、例えば以下のようにXMLシリアライズ設定にアクセスすることもできます。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.xml.*
import nl.adaptivity.xmlutil.*
import nl.adaptivity.xmlutil.serialization.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
xml(format = XML {
xmlDeclMode = XmlDeclMode.Charset
})
}
}
CBORシリアライザー
アプリケーションにCBORシリアライザーを登録するには、cbor
メソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.cbor.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
cbor()
}
}
cbor
メソッドを使用すると、例えば以下のようにCborBuilderによって提供されるCBORシリアライズ設定にアクセスすることもできます。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.cbor.*
import kotlinx.serialization.cbor.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
cbor(Cbor {
ignoreUnknownKeys = true
})
}
}
ProtoBufシリアライザー
アプリケーションにProtoBufシリアライザーを登録するには、protobuf
メソッドを呼び出します。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.protobuf.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
protobuf()
}
}
protobuf
メソッドを使用すると、例えば以下のようにProtoBufBuilderによって提供されるProtoBufシリアライズ設定にアクセスすることもできます。
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.protobuf.*
import kotlinx.serialization.protobuf.*
val client = HttpClient(CIO) {
install(ContentNegotiation) {
protobuf(ProtoBuf {
encodeDefaults = true
})
}
}
データの送受信
データクラスの作成
データの送受信を行うには、例えば以下のようなデータクラスが必要です。
data class Customer(val id: Int, val firstName: String, val lastName: String)
kotlinx.serializationを使用する場合、このクラスに@Serializable
アノテーションが付いていることを確認してください。
@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)
kotlinx.serializationライブラリは、以下の型のシリアライズ/デシリアライズをサポートしています。
データの送信
リクエストボディ内でクラスインスタンスをJSONとして送信するには、setBody
関数を使ってこのインスタンスを割り当て、contentType
を呼び出すことでコンテンツタイプをapplication/json
に設定します。
val response: HttpResponse = client.post("http://localhost:8080/customer") {
contentType(ContentType.Application.Json)
setBody(Customer(3, "Jet", "Brains"))
}
データをXMLまたはCBORとして送信するには、contentType
をContentType.Application.Xml
またはContentType.Application.Cbor
にそれぞれ設定します。
データの受信
サーバーがapplication/json
、application/xml
、またはapplication/cbor
コンテンツを含むレスポンスを送信した場合、レスポンスペイロードを受信する関数(以下の例ではbody
)のパラメータとしてデータクラスを指定することでデシリアライズできます。
val customer: Customer = client.get("http://localhost:8080/customer/3").body()
完全な例はclient-json-kotlinxにあります。