Closed18

Ktor ( client ) を 1.6.8 から 2.0.0 にバージョンアップする

tatsutakeintatsutakein

バージョンアップする前の依存関係

libs.versions.toml
[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" }
tatsutakeintatsutakein

まずは単純にバージョンのみ上げてみる

libs.versions.toml
[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" }
tatsutakeintatsutakein

JsonFeatureinstall していたところで早速怒られた 😂

tatsutakeintatsutakein

Content negotiation and serialization に記載してあった 🤞
https://ktor.io/docs/migrating-2.html#serialization-client

ライブラリを追加 & 修正する。

libs.versions.toml
[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" }
tatsutakeintatsutakein

こんな感じで変わった。

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,
+         )
+         ..
+     }
    ..
}
tatsutakeintatsutakein

io.ktor.client.plugins.HttpCallValidator.Config#handleResponseException が非推奨になってる。

https://ktor.io/docs/migrating-2.html#response-validation

tatsutakeintatsutakein

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 ->
        }
    }
    ..
}

tatsutakeintatsutakein

SocketTimeoutException があった io.ktor.network.* の名前空間が変わっているみたい。

tatsutakeintatsutakein

io.ktor.client.network.* に変わってた 🙌

- import io.ktor.network.sockets.SocketTimeoutException
+ import io.ktor.client.network.sockets.SocketTimeoutException
tatsutakeintatsutakein

io.ktor.client.request.builders の拡張関数 HttpClient#post ( post 以外もだけど ) が T ではなく io.ktor.client.statement.HttpResponse を返却するようになってる。

tatsutakeintatsutakein

post 呼んだあとに body を呼んであげれば良さそう。
作業中のコードが持ってきづらいので公式のサンプルを引っ張ってくると、こんな感じで変わる。

- val customer: Customer = client.get("http://localhost:8080/customer/3")
+ val customer: Customer = client.get("http://localhost:8080/customer/3").body()

https://ktor.io/docs/migrating-2.html#responses

このスクラップは2022/04/17にクローズされました