Firebase Functions の HTTP トリガーをアプリから呼ぶ

0

Firebase Cloud Functions には、HTTP リクエストでトリガーできる関数があります。

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) =>
{
  response.send("Hello from Firebase!");
});

基本的にはこのような形をしています。

この関数をアプリから呼び出したい場合に、簡単にできる仕組みが SDK に用意されています。

公式のドキュメントはこちらです。

まず、Function ですが、onRequest ではなく onCall というトリガーを使います。

例えば、以下のようになります。

const functions = require('firebase-functions');

exports.testDemo = functions.https.onCall((data, context) => 
{
  return { foo : data.foo };	
});

これを、Firebase のサーバにデプロイします。

すると Firebase コンソールの Functions の画面に、デプロイした関数が表示されます。

この関数はアプリから呼び出すためのものですので、ブラウザで URL を開くと、エラーが表示されます。

これを Android アプリから呼び出すには、まず、アプリレベルの build.gradle に以下の依存関係を追加します。

implementation ‘com.google.firebase:firebase-functions:19.0.2’

そして、以下のように実装します。

FirebaseFunctions functions = FirebaseFunctions.getInstance();

Map<String, Object> data = new HashMap<>();
data.put("foo", "bar");

Task<HttpsCallableResult> task = functions.getHttpsCallable("testDemo").call(data);

task.addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
  @Override
  public void onComplete(@NonNull Task<HttpsCallableResult> task) {
    if (task.isSuccessful()) {
      HttpsCallableResult result = task.getResult();
      Map map = (Map)result.getData();
      Log.d(TAG, "Call function success " + map);
    } else {
      Log.d(TAG, "Call function failure", task.getException());
    }
  }
});

ローカルエミュレータで動作している Functions を呼び出すこともできます。

ローカルエミュレータは、以下のコマンドで起動します。

$ firebase emulators:start –only functions

先ほどのアプリのコードの先頭付近を以下のように変更します。

FirebaseFunctions functions = FirebaseFunctions.getInstance();

functions.useFunctionsEmulator("http://10.0.2.2:5001");

ただし、このアプリを実行した場合、関数を呼び出した所で、下記のエラーが出ます。

java.net.UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy

Android 9 以降では、HTTP 通信が無効になっているために発生するエラーです。

これの修正方法は、ネットに沢山情報がありますので、検索してみて下さい。

解説は以上ですが、useFunctionsEmulator(“http://10.0.2.2:5001”) のところを、useFunctionsEmulator(“localhost:5001”) にした場合の、エラーについて書いておきます。

その場合、以下のようなエラーが出ます。

java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 5001) from /127.0.0.1 (port ) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)

どうも localhost を指定することは出来ないようです。

その代わり、特別に用意された 10.0.2.2 というアドレスを使う必要があるようです。

0
タイトルとURLをコピーしました