web-dev-qa-db-fra.com

Appel d'une fonction de cloud depuis Android via Firebase

Situation

J'ai créé une fonction Google Cloud via functions.https.onRequest, qui fonctionne correctement lorsque je colle son URL dans un navigateur et s'intègre parfaitement à ma configuration Firebase. Cette fonction est conçue comme une sorte de méthode API exposée à partir du backend, que je voudrais appeler des clients. Dans ce cas particulier, le client est une application Android.

Question

Existe-t-il un moyen de réaliser la requête HTTP pour la fonction Cloud en l'invoquant via Firebase? Ou devrai-je toujours effectuer une demande HTTP manuelle?

10
tvkanters

Depuis la version 12.0.0, vous pouvez appeler la fonction cloud de manière plus simple.

Ajouter la ligne suivante dans votre build.gradle

implementation 'com.google.firebase:firebase-functions:15.0.0'

Et utilisez le code suivant

FirebaseFunctions.getInstance()
    .getHttpsCallable("myCoolFunction")
    .call(optionalObject)
    .addOnFailureListener {
        Log.wtf("FF", it) 
    }
    .addOnSuccessListener {
        toast(it.data.toString())
    }

Vous pouvez l'utiliser sur le fil principal en toute sécurité. Les rappels sont également déclenchés sur le thread principal.

13
Dima Rostopira

_ {firebaser here} _

Mise à jour: est maintenant un SDK côté client qui vous permet d’appeler des fonctions de cloud directement à partir de périphériques pris en charge. Voir la réponse de Dima pour un exemple et les dernières mises à jour.

Réponse originale ci-dessous ...


@ looptheloop88 est correct. Il n'y a pas de SDK pour appelant Google Cloud Functions depuis votre application Android. Je voudrais certainement déposer une demande de fonctionnalité .

Mais pour le moment, cela signifie que vous devez utiliser le moyen habituel d'appeler les points de terminaison HTTP à partir d'Android:

10
Frank van Puffelen

Ce n'est pas possible pour l'instant, mais comme mentionné dans l'autre réponse, vous pouvez déclencher des fonctions à l'aide d'une requête HTTP à partir d'Android. Dans ce cas, il est important de protéger vos fonctions avec un mécanisme d'authentification. Voici un exemple de base:

'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');
  });
});

Pour obtenir le jeton dans Android, vous devez utiliser this puis l'ajouter à votre requête de la manière suivante:

connection = (HttpsURLConnection) url.openConnection();
...
connection.setRequestProperty("Authorization", token);
6
Sir Codesalot

Oui c'est possible :

  1. Ajoutez ceci au fichier app/build.gradle:

    implémentation 'com.google.firebase: firebase-functions: 16.1.0'


  1. Initialiser le SDK client

    fonctions FireBaseFunctions mFunctions privées;

    mFunctions = FirebaseFunctions.getInstance ();


  1. Appelle la fonction

    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;
                }
            });
       }
    

Ref: Appel des fonctions cloud de Firebase

0
Niveth Suresh