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