通过 Firebase 从 Android 调用云函数
Calling a Cloud Function from Android through Firebase
情况
我通过 functions.https.onRequest
创建了一个 Google Cloud Function,当我将它的 URL 粘贴到浏览器中时它运行良好,并且与我的 Firebase 设置很好地集成。这个函数有点像从后端公开的 API 方法,我想从客户端调用它。在此特定实例中,客户端是 Android 应用程序。
问题
有什么方法可以通过 Firebase 调用 Cloud Function 来执行 HTTP 请求吗?还是我仍然需要执行手动 HTTP 请求?
firebaser 在这里
更新:现在 有一个客户端 SDK,允许您直接从支持的设备调用 Cloud Functions。请参阅 Dima 的回答以获取示例和最新更新。
下面是原来的回答...
@looptheloop88 是正确的。没有用于从您的 Android 应用程序调用 Google Cloud Functions 的 SDK。我肯定会 file a feature request.
但目前这意味着您应该使用从 Android:
调用 HTTP 端点的常规方法
目前不可能,但如其他答案中所述,您可以从 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);
从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
是的,这是可能的:
将此添加到 app/build。gradle 文件:
实施'com.google.firebase:firebase-functions:16.1.0'
初始化客户端SDK
私有 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;
}
});
}
情况
我通过 functions.https.onRequest
创建了一个 Google Cloud Function,当我将它的 URL 粘贴到浏览器中时它运行良好,并且与我的 Firebase 设置很好地集成。这个函数有点像从后端公开的 API 方法,我想从客户端调用它。在此特定实例中,客户端是 Android 应用程序。
问题
有什么方法可以通过 Firebase 调用 Cloud Function 来执行 HTTP 请求吗?还是我仍然需要执行手动 HTTP 请求?
firebaser 在这里
更新:现在 有一个客户端 SDK,允许您直接从支持的设备调用 Cloud Functions。请参阅 Dima 的回答以获取示例和最新更新。
下面是原来的回答...
@looptheloop88 是正确的。没有用于从您的 Android 应用程序调用 Google Cloud Functions 的 SDK。我肯定会 file a feature request.
但目前这意味着您应该使用从 Android:
调用 HTTP 端点的常规方法目前不可能,但如其他答案中所述,您可以从 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);
从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
是的,这是可能的:
将此添加到 app/build。gradle 文件:
实施'com.google.firebase:firebase-functions:16.1.0'
初始化客户端SDK
私有 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; } }); }