【问题标题】:Receiving data from calling Firebase Cloud Function in Android在 Android 中调用 Firebase Cloud Function 接收数据
【发布时间】:2018-04-19 15:43:17
【问题描述】:

我正在尝试调用我编写的 firebase 云函数。

我已经使用 Postman 测试了该函数来模拟 HTTP 请求。这是我在 Postman 中调用函数时的 JSON 结果:

{
 "groups": [
    {
        "isPublic": true,
        "members": [
            true
        ],
        "numberOfMembers": 1,
        "groupId": "-LAOPAzMGzOd9qULPxue"
    },
    {
        "isPublic": true,
        "members": [
            true
        ],
        "numberOfMembers": 1,
        "groupId": "-LAOP7ISDI2JPzAgTYGi"
    }
 ]
}

我正在尝试做同样的事情并在我的 android 应用程序中检索这个 JSON 列表。我正在关注 Firebase 网站上的示例:https://firebase.google.com/docs/functions/callable

这是 Firebase 关于如何检索数据的示例:

return mFunctions
        .getHttpsCallable("addMessage")
        .call(data)
        .continueWith(new Continuation<HttpsCallableResult, String>() {
            @Override
            public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                String result = (String) task.getResult().getData();
                return result;
            }
        });

目前尚不清楚如何从我的云功能中获取结果并将其用于我的 Android 应用程序的其余部分。

此外,此示例返回一个 Task 对象,根据 Firebase 的文档,该对象现已弃用:https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/tasks/Task)

是否有更清晰、更简单的方法来处理来自函数调用的数据?

调用函数非常简单,所以我觉得必须有一个更直接的方法来接收响应。

【问题讨论】:

  • Task 在 Admin SDK for Java 中已被弃用,这就是您要链接的内容。对于 Android SDK,Task 仍然用于所有异步工作,并且不会很快改变。
  • 您找到解决方案了吗?如果他们提供像getValuetoObject 这样的方法,从 RTDB 和 Firestore 中检索到的 snapshop 自动生成模型对象,那一定是完美的。似乎task.getResult().getData() 返回一个Object。是不是意味着它也可以是String、Integer、List或其他?
  • 作为一个有根据的猜测,如果结果字符串是您的 JSON 的字符串表示,您可以使用 Gson 解析 JSON 并将数据存储到一个类中。

标签: java android firebase


【解决方案1】:

如果您只是对从端点获取 JSON 感兴趣,请从您的 Activity 中执行此操作:

        mFunctions
            .getHttpsCallable("getGroups") //Whatever your endpoint is called
            .call()
            .addOnSuccessListener(this, new OnSuccessListener<HttpsCallableResult>() {
                @Override
                public void onSuccess(HttpsCallableResult httpsCallableResult) {
                    try{
                        Gson g = new Gson();
                        String json = g.toJson(httpsCallableResult.getData());
                        Groups groups = g.fromJson(json,Groups.class);
                    } catch (Exception e){
                        Log.d("Error",e.toString());
                    }
                }
            });

【讨论】:

  • 你也可以得到一个原始的 json。您不必将其反序列化为某个数据类。 @joerick
  • @Xenolion 怎么样?我在文档中找不到这个
  • @Xenolion 我也想知道如何获取原始值(作为字符串)?
  • httpsCallableResult.getData().toString() 没用?? @SvenJacobs
【解决方案2】:

如果您使用 Kotlinx 序列化,您可以使用 org.json.JsonElement 将结果数据转换为序列化框架可以接受的格式:

val json = Json(JsonConfiguration.Stable)

fun getPerson(personId: String): Task<Person> {
    val function = functions.getHttpsCallable("getPersonInfo")

    return function.call(mapOf("personId" to personId)).continueWith { task ->
        val result = task.result ?: throw Exception("result is null")

        val jsonString = org.json.JSONObject(result.data as Map<*, *>).toString()
        json.parse(Person.serializer(), jsonString)
    }
}

【讨论】:

  • sn-p "json.parse(Person.serializer(), jsonString)" 不起作用。将其替换为“Json.parseToJsonElement(jsonString)”
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2021-01-06
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多