情况
我已经创建了一个谷歌云函数functions.https.onRequest
,当我将它的 URL 粘贴到浏览器中并与我的 Firebase 设置很好地集成时,它运行良好。这个函数有点像从后端公开的 API 方法,我想从客户端调用它。在这个特定的实例中,客户端是一个 Android 应用程序。
问题
有什么方法可以通过 Firebase 调用 Cloud Function 来执行 HTTP 请求?还是我仍需要执行手动 HTTP 请求?
我已经创建了一个谷歌云函数functions.https.onRequest
,当我将它的 URL 粘贴到浏览器中并与我的 Firebase 设置很好地集成时,它运行良好。这个函数有点像从后端公开的 API 方法,我想从客户端调用它。在这个特定的实例中,客户端是一个 Android 应用程序。
有什么方法可以通过 Firebase 调用 Cloud Function 来执行 HTTP 请求?还是我仍需要执行手动 HTTP 请求?
从 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
火力基地在这里
更新:现在有一个客户端 SDK,允许您直接从支持的设备调用 Cloud Functions。有关示例和最新更新,请参阅 Dima 的答案。
下面的原始答案...
@looptheloop88 是正确的。没有用于从您的 Android 应用调用Google Cloud Functions 的 SDK。我肯定会提出功能请求。
但目前这意味着您应该使用从 Android 调用 HTTP 端点的常规方法:
目前不可能,但正如另一个答案中提到的,您可以使用来自 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);
实施 'com.google.firebase:firebase-functions:16.1.0'
私有 FirebaseFunctions mFunctions;
mFunctions = FirebaseFunctions.getInstance();
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;
}
});
}