Вызов облачной функции от 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

Да, это возможно:

  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