Ktor ( client ) を 1.6.8 から 2.0.0 にバージョンアップする
公式ガイドを参考にして取り掛かる 💪
バージョンアップする前の依存関係
[versions]
ktor = "1.6.8"
[libraries]
ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" }
ktor-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-ios = { module = "io.ktor:ktor-client-ios", version.ref = "ktor" }
ktor-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" }
ktor-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }
まずは単純にバージョンのみ上げてみる
[versions]
- ktor = "1.6.8"
+ ktor = "2.0.0"
[libraries]
ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" }
ktor-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-ios = { module = "io.ktor:ktor-client-ios", version.ref = "ktor" }
ktor-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" }
ktor-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }
JsonFeature
を install
していたところで早速怒られた 😂
Content negotiation and serialization に記載してあった 🤞
ライブラリを追加 & 修正する。
[versions]
ktor = "2.0.0"
[libraries]
ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" }
ktor-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-ios = { module = "io.ktor:ktor-client-ios", version.ref = "ktor" }
+ ktor-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
+ ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
- ktor-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" }
ktor-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }
こんな感じで変わった。
import io.ktor.client.HttpClient
- import io.ktor.client.features.json.JsonFeature
- import io.ktor.client.features.json.serializer.KotlinxSerializer
- import kotlinx.serialization.json.Json
+ import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
+ import io.ktor.http.ContentType
+ import io.ktor.serialization.kotlinx.json.json
+ import kotlinx.serialization.json.Json
HttpClient(engineFactory = engineFactory) {
- install(JsonFeature) {
- serializer = KotlinxSerializer(
- Json {
- ..
- }
- )
- ..
- }
+ install(ContentNegotiation) {
+ json(
+ json = Json {
+ ..
+ },
+ contentType = ContentType.Application.Json,
+ )
+ ..
+ }
..
}
import io.ktor.client.features.*
が import io.ktor.client.plugins.*
にリネームされてる。
io.ktor.client.plugins.HttpCallValidator.Config#handleResponseException
が非推奨になってる。
ReplaceWith で指定されているとおり io.ktor.client.plugins.HttpCallValidator.Config#handleResponseExceptionWithRequest
を使うで良さそう。
- import io.ktor.client.HttpClient
- import io.ktor.client.features.HttpResponseValidator
+ import io.ktor.client.HttpClient
+ import io.ktor.client.plugins.HttpResponseValidator
HttpClient(engineFactory = engineFactory) {
HttpResponseValidator {
- handleResponseException{ cause ->
+ handleResponseExceptionWithRequest { cause, request ->
}
}
..
}
io.ktor.client.call.HttpResponse#receive<T>
が非推奨になってる。
これも ReplaceWith で指定されているとおり
io.ktor.client.call.HttpResponse#body<T>
を使うで良さそう。
公式の移行ガイドにも記述がある 👀
SocketTimeoutException
があった io.ktor.network.*
の名前空間が変わっているみたい。
io.ktor.client.network.*
に変わってた 🙌
- import io.ktor.network.sockets.SocketTimeoutException
+ import io.ktor.client.network.sockets.SocketTimeoutException
HttpRequestBuilder
の body
でリクエストボディをセットできなくなってる。
setBody
を使えば良さそう。
io.ktor.client.request.builders
の拡張関数 HttpClient#post
( post 以外もだけど ) が T
ではなく io.ktor.client.statement.HttpResponse
を返却するようになってる。
post
呼んだあとに body
を呼んであげれば良さそう。
作業中のコードが持ってきづらいので公式のサンプルを引っ張ってくると、こんな感じで変わる。
- val customer: Customer = client.get("http://localhost:8080/customer/3")
+ val customer: Customer = client.get("http://localhost:8080/customer/3").body()
よしゃ移行完了!
非推奨になってた関数も ReplaceWith で何に変えればいいか書いてあるし、移行ガイド自体も細かく書かれているから思っていたより楽でした 🎉🎉