【发布时间】:2021-06-03 18:02:14
【问题描述】:
我想设置一个测试函数来从我的后端返回值,但我不知道如何在我的应用程序中抓取和解析结果。我在这里找到了一个答案,说要使用我在下面标记的代码,但是我遇到了一堆错误。如何从云函数返回 N 个值?
客户端代码:
//Database Kotlin file
fun test(data: Map<*,*>): Map<*,*> {
val functions = Firebase.functions
return functions.getHttpsCallable("test")
.call(data)
.continueWith { task ->
// This continuation runs on either success or failure, but if the task
// has failed then result will throw an Exception which will be
// propagated down.
val result = task.result
//Other answer showed this JSON solution
val json = Json(JsonConfiguration.Stable)
val jsonString = org.json.JSONObject(result?.data as Map<*, *>).toString()
json.parse(Person.serializer(), jsonString)
}
}
//On the Activity
testbutton.setOnClickListener() {
var data = hashMapOf<String, Any>()
data["input1"] = "input1"
data["input2"] = "input2"
db.test(data)
//Interpret results here
}
后端:
exports.test = functions.https.onCall(async (data, context) => {
return {returnVal: 777, returnMsg: 'test return message'}
});
错误:
- 现在错误是说有一个
Type Mismatch Required: Map<*,*> Found: Task<???,???>。但是,我认为这可能是因为我在设置test()方面还差得很远。
【问题讨论】:
-
“我遇到了一堆错误”请编辑您的问题以显示确切的错误消息和堆栈跟踪。
-
@FrankvanPuffelen 是的,抱歉我离开了,因为我尝试了很多不同的方法来让它工作,这造成了很多不同的错误,哈哈。
-
您要么必须接受 lambda
(Map<>) -> Unit的参数,您可以在解析数据后调用该参数,或者如果您真的想从非阻塞函数返回,请使用协程。 -
@AnimeshSahu 你可以添加作为答案吗?
-
Callables 不会通过 Android SDK 生成 JSON。它们产生一个 Java 对象,其形式与函数返回的对象的形式相匹配。删除与 JSON 相关的所有内容,只需检查您从任务中获得的对象。此外,对 call() 的调用是异步的,并返回一个任务。您不能简单地将该 Task 转换为 Map 并期望它起作用。您必须在延续回调中处理结果。如果您希望 Task 结果更容易在 kotlin 中使用,您应该考虑使用协程并将该 Task 转换为可以在协程中使用的东西。
标签: android json kotlin google-cloud-functions