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.
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?
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.
_ {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:
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);
implémentation 'com.google.firebase: firebase-functions: 16.1.0'
fonctions FireBaseFunctions mFunctions privées;
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;
}
});
}