我如何使用 Ktor 解析响应

How do I parse a response with Ktor

我正在尝试在多平台项目中使用 Ktor 进行 Get 调用。这是代码:

private val client = HttpClient()

fun myCall(callback: (List<Film>) -> Unit) {

    viewModelScope.launch {
        val result:List<Film> = client.get {
            url("https://data.sfgov.org/resource/wwmu-gmzc.json")
        }
        callback(result)
    }
}

每次我提出这个请求时,应用程序都会关闭,而且我没有收到任何消息来告诉我发生了什么。如果我没有将 Film 列表作为结果类型,而是将 String 作为结果类型,那么它可以工作并且我收到了一个电影列表,但我想将它解析为我自己的对象,但我做不到。

通话有问题吗?

对于 Ktor http 客户端 反序列化为您的自定义对象,您需要在创建您的对象时安装 JsonFeature http 客户端,需要添加 io.ktor:ktor-client-json 依赖项。

val client = HttpClient {
   install(JsonFeature)
}

然后取决于你想使用哪个序列化器(Ktor 支持 GsonJacksonKotlinx.Serialization),需要添加各自序列化器的依赖。例如,如果你想使用Gson,你需要添加对io.ktor:ktor-client-gson的依赖。然后你的 API 响应将被反序列化为你的 List<Film> 对象。

val result: List<Film> = client.get {
   url("https://data.sfgov.org/resource/wwmu-gmzc.json")
}

Ktor 中的更多内容 documentation

对于您的 result,您也可以尝试使用 HttpResponse 作为类型。

而且我认为,您仍然必须明确使用库(例如 Gson)来解析 api-响应,例如

val result: HttpResponse = client.get("https://data.sfgov.org/resource/wwmu-gmzc.json")
val parsedResponseBody = Gson().fromJson(result.readText(), Films::class.java)

readText()HttpResponse 的扩展函数,returns 内容(响应主体)作为字符串。

您的数据 class 应该看起来像:

data class Films(val films: List<Film>) {
    data class Film(*...*)
}