Вызов облачной функции от Android через Firebase
Ситуация
Я создал Google Cloud Function через functions.https.onRequest
, который прекрасно работает, когда я вставляю его URL-адрес в браузер и хорошо интегрируется с моей установкой Firebase. Эта функция подразумевается как некоторый API-метод, открытый из бэкэнд, который я бы хотел вызвать из клиентов. В данном конкретном случае клиент является Android-приложением.
Вопрос
Можно ли каким-либо образом выполнить HTTP-запрос для Cloud Function, вызвав его через Firebase? Или мне придется выполнить ручной HTTP-запрос?
Ответы
Ответ 1
Начиная с версии 12.0.0, вы можете вызывать облачную функцию более простым способом
Добавьте следующую строку в build.gradle
implementation 'com.google.firebase:firebase-functions:16.3.0'
И используйте следующий код
FirebaseFunctions.getInstance() // Optional region: .getInstance("europe-west1")
.getHttpsCallable("myCoolFunction")
.call(optionalObject)
.addOnFailureListener {
Log.wtf("FF", it)
}
.addOnSuccessListener {
toast(it.data.toString())
}
Вы можете безопасно использовать его в главном потоке. Обратные вызовы также запускаются в основном потоке.
Ответ 2
пожарный здесь
Обновление: Существует теперь на стороне клиента SDK, который позволяет вызывать функции Cloud непосредственно из поддерживаемых устройств. См. Ответ Димы для образца и последних обновлений.
Оригинальный ответ ниже...
@looptheloop88 правильно. В вашем приложении для Android нет SDK для вызова облачных функций Google. Я бы определенно подал запрос на добавление функции.
Но на данный момент это означает, что вы должны использовать обычные способы вызова конечных точек HTTP из Android:
Ответ 3
Пока это невозможно, но, как упоминалось в другом ответе, вы можете запускать функции, используя HTTP-запрос от Android. Если вы это сделаете, важно защитить свои функции с помощью механизма аутентификации. Вот базовый пример:
'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);
Ответ 4
Да, это возможно:
-
Добавьте это в файл 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;
}
});
}
Ссылка: Вызов облачных функций Firebase