通过Firebase从Android调用云功能

时间:2017-03-18 09:41:41

标签: android firebase google-cloud-functions

情况

我已经通过functions.https.onRequest创建了Google云功能,当我将其网址粘贴到浏览器并与我的Firebase设置完美集成时,该功能运行良好。这个函数有点像从后端公开的API方法,我想从客户端调用它。在此特定实例中,客户端是Android应用程序。

问题

有什么办法可以通过Firebase调用Cloud Function来执行HTTP功能的HTTP请求吗?或者我还需要执行手动HTTP请求吗?

4 个答案:

答案 0 :(得分:14)

从12.0.0版开始,您可以更简单的方式调用云功能

build.gradle

中添加以下行
implementation 'com.google.firebase:firebase-functions:16.3.0'

并使用以下代码

FirebaseFunctions.getInstance()
    .getHttpsCallable("myCoolFunction")
    .call(optionalObject)
    .addOnFailureListener {
        Log.wtf("FF", it) 
    }
    .addOnSuccessListener {
        toast(it.data.toString())
    }

您可以安全地在主线程上使用它。回调也在主线程上触发。

答案 1 :(得分:10)

firebaser here

更新: 现在是一个客户端SDK,允许您直接从支持的设备调用云功能。有关示例和最新更新,请参阅Dima的答案。

以下原始答案......

@ looptheloop88是正确的。您的Android应用中没有用于调用 Google云端功能的SDK。我绝对会file a feature request

但目前这意味着您应该使用从Android调用HTTP端点的常规方法:

答案 2 :(得分:6)

现在不可能,但正如其他答案所述,您可以从Android trigger functions using an HTTP request。如果这样做,使用身份验证机制保护您的功能非常重要。这是一个基本的例子:

'use strict';

var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.helloWorld = functions.https.onRequest((request, response) => {
  console.log('helloWorld called');
  if (!request.headers.authorization) {
      console.error('No Firebase ID token was passed');
      response.status(403).send('Unauthorized');
      return;
  }
  admin.auth().verifyIdToken(request.headers.authorization).then(decodedIdToken => {
    console.log('ID Token correctly decoded', decodedIdToken);
    request.user = decodedIdToken;
    response.send(request.body.name +', Hello from Firebase!');
  }).catch(error => {
    console.error('Error while verifying Firebase ID token:', error);
    response.status(403).send('Unauthorized');
  });
});

要在Android中获取令牌,您应该使用this,然后将其添加到您的请求中,如下所示:

connection = (HttpsURLConnection) url.openConnection();
...
connection.setRequestProperty("Authorization", token);

答案 3 :(得分:0)

是可能的:

  1. 将此添加到 app / build.gradle 文件中:

    实现'com.google.firebase:firebase-functions:16.1.0'


  1. 初始化客户端SDK

    FirebaseFunctions专用mFunctions;

    mFunctions = FirebaseFunctions.getInstance();


  1. 调用函数

    private Task<String> addMessage(String text) {
    
    Map<String, Object> data = new HashMap<>();
    data.put("text", text);
    data.put("push", true);
    
    return mFunctions
            .getHttpsCallable("addMessage")
            .call(data)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                    // This continuation runs on either success or failure, but if the task
                    // has failed then getResult() will throw an Exception which will be
                    // propagated down.
                    String result = (String) task.getResult().getData();
                    return result;
                }
            });
       }
    

Ref : Calling Firebase cloud functions