为什么我对模拟 api 的调用没有按预期解析数据?
why is my call to a mock api not parsing the data as expected?
我正在尝试调试并找出它不起作用的原因以及如何让它起作用。
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 数据并将其装入适配器 classes 并在卡片视图中显示它们。
我的问题不在于适配器或卡片视图,而在于其余部分 API。它不想与我的模拟休息 API 一起工作,但它会与其他休息 API 一起工作。我不确定为什么?
我已经尝试添加网络安全例外,我不得不删除我的适配器 class 只是为了让它说成功。当我收到 onresponse 调用时,我仍然无法在控制台中找到 JSON 正文,并且因为我在调试控制台中没有收到错误信息,所以我不知道发生了什么。
我不知道这里有什么问题。是 GSON 转换器吗?,其余 API,我的代码?我的模拟器有问题吗?...等等?
正文应该打印到控制台的 classes:
class note(val noteis: List<Mlist>)
class Mlist(val text1: String, val text2: String, val text3: String)
我可以看到两个问题:
onFailure
方法中没有堆栈跟踪。让我们添加它:
println("Failed to execute request, $e")
运行现在这个returns
PKIX path building failed: (...) unable to find valid certification path to requested target
这失败了,因为 Java 不信任来自 www.mocky.io
的证书。您可以通过更改 OkHttpClient
的配置来添加或忽略它,但现在让我们简单地将 url 从 https://
更改为 http://
。
通过该更改,您应该打印出响应正文,否则您的错误超出了提供的代码范围。
- 响应 class 与 json 数据不匹配。
JSON 来自 link 的数据如下所示:
{
"Mlist": {
"text1": "text1a",
"text2": "text2a",
"text3": "text3a"
}
}
所以它不是 Mlist
个对象的列表,而是名为 Mlist
的字段中的单个对象。
为了匹配这个,我们可以:
a) 更改note
class
中字段的名称
class note(val Mlist: Mlist)
b) 使用@SerializedName
注解
@SerializedName("Mlist")
val notes: Mlist
顺便说一句。您可以将 note
和 Mlist
更改为 data class
以便能够使用 print*
方法查看其内容。
我正在尝试调试并找出它不起作用的原因以及如何让它起作用。
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 数据并将其装入适配器 classes 并在卡片视图中显示它们。
我的问题不在于适配器或卡片视图,而在于其余部分 API。它不想与我的模拟休息 API 一起工作,但它会与其他休息 API 一起工作。我不确定为什么?
我已经尝试添加网络安全例外,我不得不删除我的适配器 class 只是为了让它说成功。当我收到 onresponse 调用时,我仍然无法在控制台中找到 JSON 正文,并且因为我在调试控制台中没有收到错误信息,所以我不知道发生了什么。
我不知道这里有什么问题。是 GSON 转换器吗?,其余 API,我的代码?我的模拟器有问题吗?...等等?
正文应该打印到控制台的 classes:
class note(val noteis: List<Mlist>)
class Mlist(val text1: String, val text2: String, val text3: String)
我可以看到两个问题:
onFailure
方法中没有堆栈跟踪。让我们添加它:
println("Failed to execute request, $e")
运行现在这个returns
PKIX path building failed: (...) unable to find valid certification path to requested target
这失败了,因为 Java 不信任来自 www.mocky.io
的证书。您可以通过更改 OkHttpClient
的配置来添加或忽略它,但现在让我们简单地将 url 从 https://
更改为 http://
。
通过该更改,您应该打印出响应正文,否则您的错误超出了提供的代码范围。
- 响应 class 与 json 数据不匹配。
JSON 来自 link 的数据如下所示:
{
"Mlist": {
"text1": "text1a",
"text2": "text2a",
"text3": "text3a"
}
}
所以它不是 Mlist
个对象的列表,而是名为 Mlist
的字段中的单个对象。
为了匹配这个,我们可以:
a) 更改note
class
class note(val Mlist: Mlist)
b) 使用@SerializedName
注解
@SerializedName("Mlist")
val notes: Mlist
顺便说一句。您可以将 note
和 Mlist
更改为 data class
以便能够使用 print*
方法查看其内容。