【问题标题】:why is my call to a mock api not parsing the data as expected?为什么我对模拟 api 的调用没有按预期解析数据?
【发布时间】:2020-06-01 13:12:30
【问题描述】:

我正在尝试调试并找出无法正常工作的原因以及如何使其正常工作。

MainActivity.kt

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

        ...

    fetchJson()
}

所以这只是调用我的函数fetchJson

这是函数:

fun fetchJson() {
    println("Attempting to Fetch JSON")

    val url = "https://www.mocky.io/v2/5ed340ab340000650001f28c"

    val request = Request.Builder().url(url).build()

    val client = OkHttpClient()
    client.newCall(request).enqueue(object: okhttp3.Callback {
        override fun onFailure(call: okhttp3.Call, e: IOException) {
            println("Failed to execute request")
        }

        override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
            val body = response?.body?.string()
            println(body)
            println("success")
            val gson = GsonBuilder().create()

            val homeFeed = gson.fromJson(body, note::class.java)

           /* runOnUiThread {
                recycler_view.adapter = MainAdapter(homeFeed)
            }*/
        }

    })

这背后的想法是您获取 JSON 数据并将其放入适配器类中并在卡片视图中显示它们。

我的问题不在于适配器或卡片视图,而在于其余的 API。它不想与我的模拟休息 API 一起工作,但它会与其他休息 API 一起工作。我不知道为什么?

我试图添加一个网络安全异常,我不得不删除我的适配器类只是为了让它说成功。当我收到 onresponse 调用时,我仍然无法在控制台中找到 JSON 正文,并且因为我在调试控制台中没有收到错误,所以我不知道发生了什么。

我不知道这里有什么问题。是 GSON 转换器吗?其余的 API,我的代码?我的模拟器有问题吗?...等等?

主体应打印到控制台的类:

class note(val noteis: List<Mlist>)

class Mlist(val text1: String, val text2: String, val text3: String)

【问题讨论】:

  • and because I don't get error's in the debug console 好吧,您的 onFailure 方法在这里并不是特别有用。打印请求失败不会帮助您进行调试,而是应该打印异常的堆栈跟踪。 onFailure 不仅仅是因为请求失败,而是请求失败,这不是一回事:)

标签: java android json kotlin kotlin-android-extensions


【解决方案1】:

我可以看到两个问题:

  1. onFailure 方法中没有堆栈跟踪。让我们添加它:
println("Failed to execute request, $e")

现在运行返回 PKIX path building failed: (...) unable to find valid certification path to requested target 这失败了,因为 Java 不信任来自 www.mocky.io 的证书。您可以通过更改OkHttpClient 的配置来添加或忽略它,但现在让我们简单地将url 从https:// 更改为http://

通过该更改,您应该会打印出响应正文,否则您的错误超出了提供的代码。

  1. 响应类与 json 数据不匹配。

链接中的 JSON 数据如下所示:

{
    "Mlist": {
        "text1": "text1a",
        "text2": "text2a",
        "text3": "text3a"
    }
}

所以它不是Mlist 对象的列表,而是名为Mlist 的字段中的单个对象。 为了匹配这一点,我们可以:

a) 更改note 类中的字段名称

class note(val Mlist: Mlist)

b) 使用@SerializedName注解

    @SerializedName("Mlist")
    val notes: Mlist

顺便说一句。您可以将noteMlist 更改为data class 以便能够使用print* 方法查看其内容。

【讨论】:

  • 感谢您提供有关堆栈跟踪的提示。我能够找出为什么它甚至不会出现在调试中。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2017-02-23
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多