从Android中调用Firebase云功能接收数据

时间:2018-04-19 15:43:18

标签: java android firebase

我试图调用我编写的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

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

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

2 个答案:

答案 0 :(得分:1)

如果您使用的是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)
    }
}

答案 1 :(得分:0)

如果您只是想从端点获取JSON,请通过“活动”执行此操作:

        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());
                    }
                }
            });