无法在 kotlin js 中使用 ktor 客户端发布请求

Posted

技术标签:

【中文标题】无法在 kotlin js 中使用 ktor 客户端发布请求【英文标题】:Not able to post request using ktor client in kotlin js 【发布时间】:2020-11-01 13:51:03 【问题描述】:

我正在尝试发出 http post 请求,但由于无法理解的原因而失败。

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:“发送正文失败。内容类型:OwnerMapper 类,但应有 OutgoingContent。”,cause_th0jdv$_0:空,堆栈:“captureStack↵Exception↵RuntimeException↵IllegalSta…↵↵↵↵↵ ↵↵↵↵↵↵↵↵↵↵↵↵promiseReactionJob@[native code]”,名称:“IllegalStateException”

添加序列化插件后,出现此错误:

“找不到类 OwnerMapper 的无参数序列化程序。对于泛型类,例如列表,请显式提供序列化程序。”

我已按照官方示例进行操作,但无法使其运行。正在使用 Kotlin/Js 及以上错误来自浏览器。

【问题讨论】:

【参考方案1】:
    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:选择合适的版本号。

【讨论】:

【参考方案2】:

您的OwnerMapper 课程是否标记为@Serializable

如果不是——请标记为@Serializable

如果是,请您尝试在没有 Ktor 的情况下重现第二个问题 ("Can't locate argument-less serializer for class OwnerMapper. For generic classes, such as lists, please provide serializer explicitly.")。在我看来,这似乎是序列化的问题,可能缺少一些依赖项。

请看一下github问题:https://github.com/Kotlin/kotlinx.serialization/issues/278

【讨论】:

它被标记为可序列化,目前是手动序列化而不是在ktor客户端安装功能。由于手动 serializatioj 正在工作,所以我猜依赖是完整的,ktor 客户端似乎有问题。我会尝试分离出问题并调试。 @TarunChawla 你能附上你的项目的链接吗? 我在这里做错了几件事。我会发布正确方法的答案。

以上是关于无法在 kotlin js 中使用 ktor 客户端发布请求的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin/Native 无法导入 io.ktor.network.selector.ActorSelectorManager

Kotlin Ktor 客户端 mltiplatform gradle 配置

克托尔。无法在 kotlin-js 端创建 Httpclient 的实例

如何确保清除 ktor websocket 客户端创建的所有 Kotlin 协程?

如何使用 okhttp 引擎将 HostnameVerifier 添加到 ktor 客户端

在 ktor httpClient(js) JS 引擎中忽略自签名证书的配置