【问题标题】: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 支持 GsonJacksonKotlinx.Serialization),您需要添加各个序列化程序的依赖关系。例如,如果要使用Gson,则需要添加io.ktor:ktor-client-gson 的依赖项。然后您的 API 响应将反序列化为您的 List&lt;Film&gt; 对象。

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

      在 Ktor documentation 中了解更多信息

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多