我有一个Kotlin函数,它从一个api端点获取数据。基础api端点在活动中的一个常量中。它看起来像这样:
object AppConstants {
const val API_URL = "http://192.168.100.2:8000/api/"
}
函数是这样的:
private fun thisGenreBookListJson(recyclerView: RecyclerView) {
val categoryId: String = intent.getStringExtra(CATEGORY_ID).toString()
// we get the url to list all the book genres
val genreAPiUrl = AppConstants.API_URL +"books/category/$categoryId"
val thisRequest = Request.Builder().url(genreAPiUrl).build()
val client = OkHttpClient()
// enqueue makes sure the thread runs in the background
client.newCall(thisRequest).enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
val thisBody = response.body?.string()
val thisGson = GsonBuilder().create()
val bookList = thisGson.fromJson(thisBody, BookList::class.java)
this@CategoryViewerActivity.runOnUiThread {
recyclerView.adapter = CategoryBookListAdapter(bookList)
}
}
override fun onFailure(call: Call, e: IOException) {
println("Failed fetching URL $e")
}
})
请看val genreAPiUrl = "http://192.168.100.2:8000/api/books/category/$categoryId"
这一行,如果保持不变,它会抛出一个com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
错误。但是,在调试应用程序时,URL的格式似乎是正确的。如果我用数据库中的一个类别替换该行中的$categoryId
,代码运行时不会出现任何错误,在调试时,它与连接的代码相同。在函数的第一行,去除toString()
也没有效果。
我在这里找不到任何类似问题。
我会错过什么呢?是连接问题吗?谢谢。
3条答案
按热度按时间2uluyalo1#
抛出
IllegalStateException
是因为服务器返回错误而不是预期的Json(我假设是404/40 x)。由于使用有效的
categoryId
是可行的,因此从Intent
检索的categoryId
必须是无效的。但是,在调试应用程序时,URL的格式似乎正确
这可能有两层意思:
1.使用调试器单步调试时,您可以验证
categoryId
是否是有效/正确的id,数据库中是否存在图书类别1.使用调试器单步调试时,您可以验证URL的格式是否正确,但不验证
categoryId
是否有效/正确案例1
由于调试会话显示
categoryId
是正确的,结论是这是一个争用条件。一定有什么东西没有正确设置Intent
参数,或者设置得太晚,以至于当您单步调试时它是正确的,但在没有附加调试器的情况下运行时它还不正确。下一步是使用一些print语句来检查应用程序在没有调试器的情况下运行时categoryId
是否正确(可能不正确),然后找出在Intent
中设置id时出现的错误。案例2
在这种情况下,你需要调试根本原因,那就是
Intent
中的id是错误的。没有看到更多的代码,就不可能知道id来自哪里,为什么它是无效的。ewm0tg9j2#
您可以尝试以下方法:
yizd12fk3#
这意味着JSON的格式可能不正确。
Gson希望您的JSON字符串以从打开的对象开始
但React开始于