【问题标题】:How do I parse a response with Ktor如何使用 Ktor 解析响应
【发布时间】:2021-02-08 17:11:36
【问题描述】:
我正在尝试在多平台项目中使用 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 放入,那么它可以工作并且我收到一个电影列表,但我想将其解析为我自己的对象,但我无法。
电话有问题吗?
【问题讨论】:
标签:
json
kotlin
ktor
kotlin-multiplatform
【解决方案1】:
对于您的result,您也可以尝试使用HttpResponse 作为类型。
我认为,您仍然必须显式使用库(例如Gson)来解析 api-response,例如
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(*...*)
}
【解决方案2】:
对于 Ktor http 客户端反序列化为您的自定义对象,您需要在创建 http 客户端时安装 JsonFeature,这需要 io.ktor:ktor-client-json添加了依赖项。
val client = HttpClient {
install(JsonFeature)
}
然后根据您要使用的序列化程序(Ktor 支持 Gson、Jackson 和 Kotlinx.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 中了解更多信息