20

情况

我已经创建了一个谷歌云函数functions.https.onRequest,当我将它的 URL 粘贴到浏览器中并与我的 Firebase 设置很好地集成时,它运行良好。这个函数有点像从后端公开的 API 方法,我想从客户端调用它。在这个特定的实例中,客户端是一个 Android 应用程序。

问题

有什么方法可以通过 Firebase 调用 Cloud Function 来执行 HTTP 请求?还是我仍需要执行手动 HTTP 请求?

4

4 回答 4

27

从 12.0.0 版本开始,您可以以更简单的方式调用云函数

在您的中添加以下行build.gradle

implementation 'com.google.firebase:firebase-functions:19.0.2'

并使用以下代码

FirebaseFunctions.getInstance() // Optional region: .getInstance("europe-west1")
    .getHttpsCallable("myCoolFunction")
    .call(optionalObject)
    .addOnFailureListener {
        Log.wtf("FF", it) 
    }
    .addOnSuccessListener {
        toast(it.data.toString())
    }

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

您可以在官方文档中阅读更多内容:https ://firebase.google.com/docs/functions/callable

于 2018-03-21T10:01:54.327 回答
10

火力基地在这里

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

下面的原始答案...


@looptheloop88 是正确的。没有用于从您的 Android 应用调用Google Cloud Functions 的 SDK。我肯定会提出功能请求

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

于 2017-03-18T14:44:48.067 回答
6

目前不可能,但正如另一个答案中提到的,您可以使用来自 Android的 HTTP 请求来触发函数。如果这样做,使用身份验证机制保护您的函数非常重要。这是一个基本示例:

'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 中获取令牌,您应该使用,然后将其添加到您的请求中,如下所示:

connection = (HttpsURLConnection) url.openConnection();
...
connection.setRequestProperty("Authorization", token);
于 2017-05-01T11:01:36.177 回答
2

是的,有可能:

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

参考:调用 Firebase 云函数

于 2018-08-17T11:40:53.220 回答