如何使用Ktor解析响应

6

我正在尝试在多平台项目中使用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)
    }
}

每次发出这个请求时,应用程序都会关闭,我没有收到任何提示我发生了什么的消息。如果将结果类型从列表电影更改为字符串,则可以正常工作并接收到电影列表,但是我想将其解析为自己的对象,但无法实现。
这个调用有问题吗?
2个回答

3

对于您的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 的扩展函数,它将响应正文作为字符串返回。

你的数据类应该如下所示:

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

3
为了让Ktor http客户端能够对您的自定义对象进行反序列化,您需要在创建http客户端时安装JsonFeature,这需要添加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 文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接