Невозможно отправить запрос с помощью клиента ktor в kotlin js

Я пытаюсь отправить HTTP-запрос, но он не работает по непонятным причинам.

object KtorClient {
val client = HttpClient() {
    install(JsonFeature) {
        serializer = KotlinxSerializer()
    }
 }
}
suspend fun createOwner(url : String = "http://localhost:112/company/owner/register", ownerMapper: OwnerMapper) {
println(ownerMapper)
client.post<Unit>(url){
   body = ownerMapper
}
}

BlockquoteIllegalStateException {message_8yp7un $ _0: Не удалось отправить тело сообщения. Контент имеет тип: class OwnerMapper, но ожидается OutgoingContent., Cause_th0jdv $ _0: null, stack: captureStack↵Exception↵RuntimeException↵IllegalSta… ↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵promiseReactionJob @ [native code ], имя: IllegalStateException}

После добавления плагина сериализации я получаю эту ошибку:

Не удалось найти сериализатор без аргументов для класса OwnerMapper. Для общих классов, таких как списки, явно укажите сериализатор.

Я последовал официальному примеру, но не смог запустить его. Я использую Kotlin / Js и выше ошибка исходит из браузера.


person Tarun Chawla    schedule 12.07.2020    source источник


Ответы (2)


    val client = HttpClient() {
        install(JsonFeature){
            serializer = KotlinxSerializer()
        }
    }
@Serializable
data class OwnerLoginMapper(
    val email: String? = null,
    val username: String? = null,
    val number: String? = null,
    val credential: String
)
@Serializable
data class Token(
    val token : String
)
var response = client.post<Token>(url){
    contentType(ContentType.Application.Json)
    body = ownerMapper
}
println(response.token)

Добавьте эти зависимости:

implementation("io.ktor:ktor-client-json-js:1.3.2")
implementation("io.ktor:ktor-client-serialization-js:1.3.2")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:0.20.0")

Примените этот плагин:

    kotlin("plugin.serialization") version "1.3.70"

PS: Выберите подходящий номер версии.

person Tarun Chawla    schedule 20.07.2020

Ваш OwnerMapper класс отмечен как @Serializable?

Если нет - отметьте это как @Serializable

Если да - не могли бы вы попытаться воспроизвести вторую задачу ("Can't locate argument-less serializer for class OwnerMapper. For generic classes, such as lists, please provide serializer explicitly.") без Ktor. На мой взгляд, это проблема с сериализацией, возможно, отсутствует какая-то зависимость.

Также обратите внимание на проблему с github: https://github.com/Kotlin/kotlinx.serialization/issues/278

person Brilyantov Vadim    schedule 16.07.2020
comment
Он отмечен как сериализуемый, в настоящее время я выполняю сериализацию вручную вместо установки функции в клиенте ktor. Поскольку ручная сериализация работает, я думаю, что зависимости завершены, кажется, что с клиентом ktor что-то не так. Я постараюсь отделить проблему и отладить. - person Tarun Chawla; 17.07.2020
comment
@TarunChawla Можете прикрепить ссылку на свой проект? - person vanyochek; 17.07.2020
comment
Я делал здесь несколько вещей неправильно. Я отправлю ответ, чтобы все было правильно. - person Tarun Chawla; 20.07.2020