از برنامه خود با توابع تماس بگیرید

توابع ابری برای SDK های سرویس گیرنده Firebase به شما امکان می دهد تا مستقیماً از طریق یک برنامه Firebase با توابع تماس بگیرید. برای فراخوانی یک تابع از برنامه خود به این روش ، یک تابع HTTPS Callable را در Cloud Functions بنویسید و مستقر کنید و سپس منطق مشتری را برای فراخوانی عملکرد از برنامه خود اضافه کنید.

این مهم است که به خاطر داشته باشید که HTTPS توابع قابل فراخوانی توابع مشابه اما به HTTP یکسان نیست. برای استفاده از HTTPS توابع قابل فراخوانی شما باید SDK مشتری برای پلت فرم خود را همراه با استفاده از functions.https API باطن (یا اجرای پروتکل). موارد قابل تماس دارای تفاوت های کلیدی با توابع HTTP هستند:

  • در صورت وجود ، نشانه های تأیید هویت Firebase ، نشانه های FCM و نشانه های App Check ، در صورت وجود ، به طور خودکار در درخواست ها گنجانده می شوند.
  • functions.https.onCall ماشه به طور خودکار deserializes بدن درخواست و تایید تایید نشانه.

Firebase SDK for Cloud Functions v0.9.1 و بالاتر با این نسخه های حداقل SDK کلاینت Firebase برای پشتیبانی از توابع قابل تماس HTTPS همکاری می کند:

  • SDK Firebase برای iOS 8.7.0
  • SDK Firebase برای Android 20.0.1
  • Firebase JavaScript SDK 8.10.0
  • Firebase Modular Web SDK نسخه 9.0.0

اگر شما می خواهید برای اضافه کردن قابلیت شبیه به یک برنامه ساخته شده بر روی یک پلت فرم پشتیبانی نشده، دیدن برای مشخصات پروتکل https.onCall . بقیه این راهنما دستورالعمل هایی در مورد نحوه نوشتن ، استقرار و فراخوانی یک عملکرد قابل تماس HTTPS برای iOS ، Android ، وب ، C ++ و Unity ارائه می دهد.

تابع callable را بنویسید و استقرار دهید

استفاده از functions.https.onCall برای ایجاد یک HTTPS قابل فراخوانی تابع. : این متد دو پارامتر طول می کشد data ، و اختیاری context :

// Saves a message to the Firebase Realtime Database but sanitizes the text by removing swearwords.
exports.addMessage = functions.https.onCall((data, context) => {
  // ...
});

برای یک تابع فراخوانی که موجب صرفه جویی یک پیام متنی به پایگاه بیدرنگ، برای مثال، data می تواند شامل متن پیام، در حالی که context پارامترهای نشان دهنده کاربران اطلاعات تایید:

// Message text passed from the client.
const text = data.text;
// Authentication / user information is automatically added to the request.
const uid = context.auth.uid;
const name = context.auth.token.name || null;
const picture = context.auth.token.picture || null;
const email = context.auth.token.email || null;

فاصله بین موقعیت عملکرد تماس گیرنده و محل تماس گیرنده می تواند تأخیر شبکه را ایجاد کند. برای بهینه سازی عملکرد، در نظر مشخص کردن محل تابع در آن قابل اجرا، و مطمئن شوید که به چین محل قابل فراخوانی با محل تنظیم زمانی که شما مقداردهی اولیه SDK در سمت سرویس گیرنده.

به صورت اختیاری ، می توانید یک گواهی بررسی برنامه را ضمیمه کنید تا از منابع پشتیبان خود در برابر سوء استفاده ، مانند تقلب در صورتحساب یا فیشینگ محافظت کند. مشاهده فعال کردن برنامه بررسی اجرای برای توابع ابر .

ارسال مجدد نتیجه

برای ارسال مجدد داده ها به سرویس گیرنده ، داده هایی را که می توان JSON کدگذاری کرد ، بازگردانید. به عنوان مثال ، برای بازگرداندن نتیجه عملیات اضافه:

// returning result.
return {
  firstNumber: firstNumber,
  secondNumber: secondNumber,
  operator: '+',
  operationResult: firstNumber + secondNumber,
};

برای بازگشت داده ها پس از یک عملیات ناهمزمان ، یک قول را برگردانید. داده های برگشت داده شده توسط وعده به مشتری ارسال می شود. به عنوان مثال ، می توانید متن ضدعفونی شده را که تابع تماس گیرنده نوشته است به پایگاه داده Realtime برگردانید:

// Saving the new message to the Realtime Database.
const sanitizedMessage = sanitizer.sanitizeText(text); // Sanitize the message.
return admin.database().ref('/messages').push({
  text: sanitizedMessage,
  author: { uid, name, picture, email },
}).then(() => {
  console.log('New Message written');
  // Returning the sanitized message to the client.
  return { text: sanitizedMessage };
})

رسیدگی به خطاها

برای اطمینان از مشتری می شود جزئیات خطا مفید، خطاهای بازگشت از قابل فراخوانی با پرتاب (یا بازگشت یک وعده با رد) یک نمونه از functions.https.HttpsError . خطای یک code ویژگی است که می تواند یکی از مقادیر ذکر شده در functions.https.HttpsError . خطاهای همچنین یک رشته message ، که به طور پیش فرض یک رشته خالی. آنها همچنین می توانند اختیاری دارند details زمینه با مقدار دلخواه. اگر یک دیگر خطای از HttpsError از توابع خود را پرتاب می شود، مشتری خود را به جای یک خطا با پیام دریافت INTERNAL و کد internal .

به عنوان مثال ، یک تابع می تواند خطاهای اعتبارسنجی و احراز هویت داده ها را با پیام های خطا برای بازگشت به سرویس گیرنده پرتاب کند:

// Checking attribute.
if (!(typeof text === 'string') || text.length === 0) {
  // Throwing an HttpsError so that the client gets the error details.
  throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' +
      'one arguments "text" containing the message text to add.');
}
// Checking that the user is authenticated.
if (!context.auth) {
  // Throwing an HttpsError so that the client gets the error details.
  throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
      'while authenticated.');
}

تابع قابل تماس را مستقر کنید

بعد از اینکه شما یک تابع فراخوانی ظرف نجات index.js ، آن است که همراه با تمام توابع دیگر زمانی که شما اجرا مستقر firebase deploy . برای اجرای تنها قابل فراخوانی، با استفاده از --only استدلال به عنوان نشان داده شده است به انجام اعزام جزئی :

$ firebase deploy --only functions:addMessage

اگر شما از اشتباهات مجوز زمانی که استقرار توابع روبرو می شوند، مطمئن شوید که مناسب نقش IAM به کاربر در حال اجرا دستورات استقرار اختصاص داده است.

محیط توسعه مشتری خود را تنظیم کنید

مطمئن شوید که پیش نیازهای لازم را دارید ، سپس وابستگی ها و کتابخانه های سرویس گیرنده مورد نیاز را به برنامه خود اضافه کنید.

iOS

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه iOS خود .
  2. اضافه کردن ابر توابع غلاف به خود Podfile :
    pod 'Firebase/Functions'
  3. فایل را ذخیره کنید و سپس اجرا:
    pod install

نسخه وب 9

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه وب خود . اطمینان حاصل کنید که برای اجرای فرمان زیر را از ترمینال شما:
    npm install firebase@9.0.2 --save
    
  2. به صورت دستی به دو مورد اصلی Firebase و عملکردهای Cloud نیاز دارید:

     import { initializeApp } from 'firebase/app';
     import { getFunctions } from 'firebase/functions';
    
     const app = initializeApp({
         projectId: '### CLOUD FUNCTIONS PROJECT ID ###',
         apiKey: '### FIREBASE API KEY ###',
         authDomain: '### FIREBASE AUTH DOMAIN ###',
       });
     const functions = getFunctions(app);
    

نسخه وب 8

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه وب خود .
  2. اضافه کردن هسته فایربیس و ابر کتابخانه توابع مشتری به برنامه خود قرار دهید:
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-functions.js"></script>
    

SDK عملکردهای ابری نیز به عنوان یک بسته npm در دسترس است.

  1. فرمان زیر را اجرا از ترمینال خود را:
    npm install firebase@8.10.0 --save
    
  2. دستی نیاز به هر دو هسته فایربیس و توابع ابر:
    const firebase = require("firebase");
    // Required for side-effects
    require("firebase/functions");
    

جاوا

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه آندروید خود را .

  2. با استفاده از فایربیس آندروید BOM ، اعلام وابستگی برای توابع ابر کتابخانه آندروید در ماژول خود را (در سطح برنامه) فایل Gradle (معمولا app/build.gradle ).

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.1')
    
        // Declare the dependency for the Cloud Functions library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions'
    }
    

    با استفاده از فایربیس آندروید BOM ، برنامه شما همیشه نسخه های سازگار با کتابخانه فایربیس آندروید استفاده خواهد کرد.

    (جایگزین) اعلام فایربیس وابستگی کتابخانه بدون استفاده از BOM

    در صورت عدم استفاده از Firebase BoM ، باید هر نسخه کتابخانه Firebase را در خط وابستگی مشخص کنید.

    توجه داشته باشید که در صورت استفاده از کتابخانه فایربیس های متعدد در برنامه شما، ما به شدت توصیه با استفاده از BOM به مدیریت نسخه های کتابخانه، که تضمین می کند که تمام نسخه های سازگار است.

    dependencies {
        // Declare the dependency for the Cloud Functions library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions:20.0.1'
    }
    

Kotlin+KTX

  1. دستورالعمل ها را به دنبال اضافه فایربیس به برنامه آندروید خود را .

  2. با استفاده از فایربیس آندروید BOM ، اعلام وابستگی برای توابع ابر کتابخانه آندروید در ماژول خود را (در سطح برنامه) فایل Gradle (معمولا app/build.gradle ).

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.1')
    
        // Declare the dependency for the Cloud Functions library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions-ktx'
    }
    

    با استفاده از فایربیس آندروید BOM ، برنامه شما همیشه نسخه های سازگار با کتابخانه فایربیس آندروید استفاده خواهد کرد.

    (جایگزین) اعلام فایربیس وابستگی کتابخانه بدون استفاده از BOM

    در صورت عدم استفاده از Firebase BoM ، باید هر نسخه کتابخانه Firebase را در خط وابستگی مشخص کنید.

    توجه داشته باشید که در صورت استفاده از کتابخانه فایربیس های متعدد در برنامه شما، ما به شدت توصیه با استفاده از BOM به مدیریت نسخه های کتابخانه، که تضمین می کند که تمام نسخه های سازگار است.

    dependencies {
        // Declare the dependency for the Cloud Functions library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-functions-ktx:20.0.1'
    }
    

C ++

برای C ++ با آندروید:

  1. دستورالعمل ها را به دنبال اضافه فایربیس به C ++ پروژه خود را .
  2. اضافه کردن firebase_functions کتابخانه برای خود CMakeLists.txt فایل.

برای C ++ با سیستم عامل iOS:

  1. دستورالعمل ها را به دنبال اضافه فایربیس به C ++ پروژه خود را .
  2. اضافه کردن ابر توابع غلاف به خود Podfile :
    pod 'Firebase/Functions'
  3. فایل را ذخیره کنید و سپس اجرا:
    pod install
  4. اضافه کردن هسته فایربیس و ابر توابع چارچوب از فایربیس C ++ SDK به پروژه Xcode متعلق به خود را.
    • firebase.framework
    • firebase_functions.framework

وحدت

  1. دستورالعمل ها را به دنبال اضافه فایربیس به پروژه وحدت خود را .
  2. اضافه کردن FirebaseFunctions.unitypackage از فایربیس وحدت SDK را به پروژه وحدت خود را.

SDK مشتری را اولیه کنید

یک نمونه از توابع Cloud را راه اندازی کنید:

سریع

lazy var functions = Functions.functions()

هدف-ج

@property(strong, nonatomic) FIRFunctions *functions;
// ...
self.functions = [FIRFunctions functions];

نسخه وب 8

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
  databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});

// Initialize Cloud Functions through Firebase
var functions = firebase.functions();

نسخه وب 9

const app = initializeApp({
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###',
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
});
const functions = getFunctions(app);

جاوا

private FirebaseFunctions mFunctions;
// ...
mFunctions = FirebaseFunctions.getInstance();

Kotlin+KTX

private lateinit var functions: FirebaseFunctions
// ...
functions = Firebase.functions

C ++

firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance(app);

وحدت

functions = Firebase.Functions.DefaultInstance;

با تابع تماس بگیرید

سریع

functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in
  if let error = error as NSError? {
    if error.domain == FunctionsErrorDomain {
      let code = FunctionsErrorCode(rawValue: error.code)
      let message = error.localizedDescription
      let details = error.userInfo[FunctionsErrorDetailsKey]
    }
    // ...
  }
  if let data = result?.data as? [String: Any], let text = data["text"] as? String {
    self.resultField.text = text
  }
}

هدف-ج

[[_functions HTTPSCallableWithName:@"addMessage"] callWithObject:@{@"text": _inputField.text}
                                                      completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
  if (error) {
    if (error.domain == FIRFunctionsErrorDomain) {
      FIRFunctionsErrorCode code = error.code;
      NSString *message = error.localizedDescription;
      NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
    }
    // ...
  }
  self->_resultField.text = result.data[@"text"];
}];

نسخه وب 8

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    var sanitizedMessage = result.data.text;
  });

نسخه وب 9

import { getFunctions, httpsCallable } from "firebase/functions";

const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    /** @type {any} */
    const data = result.data;
    const sanitizedMessage = data.text;
  });

جاوا

private Task<String> addMessage(String text) {
    // Create the arguments to the callable function.
    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;
                }
            });
}

Kotlin+KTX

private fun addMessage(text: String): Task<String> {
    // Create the arguments to the callable function.
    val data = hashMapOf(
        "text" to text,
        "push" to true
    )

    return functions
            .getHttpsCallable("addMessage")
            .call(data)
            .continueWith { task ->
                // This continuation runs on either success or failure, but if the task
                // has failed then result will throw an Exception which will be
                // propagated down.
                val result = task.result?.data as String
                result
            }
}

C ++

firebase::Future<firebase::functions::HttpsCallableResult> AddMessage(
    const std::string& text) {
  // Create the arguments to the callable function.
  firebase::Variant data = firebase::Variant::EmptyMap();
  data.map()["text"] = firebase::Variant(text);
  data.map()["push"] = true;

  // Call the function and add a callback for the result.
  firebase::functions::HttpsCallableReference doSomething =
      functions->GetHttpsCallable("addMessage");
  return doSomething.Call(data);
}

وحدت

private Task<string> addMessage(string text) {
  // Create the arguments to the callable function.
  var data = new Dictionary<string, object>();
  data["text"] = text;
  data["push"] = true;

  // Call the function and extract the operation from the result.
  var function = functions.GetHttpsCallable("addMessage");
  return function.CallAsync(data).ContinueWith((task) => {
    return (string) task.Result.Data;
  });
}

رسیدگی به خطاهای مشتری

در صورتی که سرور خطایی داشته باشد یا وعده حاصله رد شود ، سرویس گیرنده خطایی دریافت می کند.

اگر خطا بازگردانده شده توسط تابع از نوع function.https.HttpsError ، پس از آن مشتری خطا دریافت code ، message ، و details از خطای سرور. در غیر این صورت، خطا شامل پیام INTERNAL و کد INTERNAL . راهنمایی برای چگونه برای دیدن رسیدگی به اشتباهات در عملکرد قابل فراخوانی خود را.

سریع

if let error = error as NSError? {
  if error.domain == FunctionsErrorDomain {
    let code = FunctionsErrorCode(rawValue: error.code)
    let message = error.localizedDescription
    let details = error.userInfo[FunctionsErrorDetailsKey]
  }
  // ...
}

هدف-ج

if (error) {
  if (error.domain == FIRFunctionsErrorDomain) {
    FIRFunctionsErrorCode code = error.code;
    NSString *message = error.localizedDescription;
    NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
  }
  // ...
}

نسخه وب 8

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    var sanitizedMessage = result.data.text;
  })
  .catch((error) => {
    // Getting the Error details.
    var code = error.code;
    var message = error.message;
    var details = error.details;
    // ...
  });

نسخه وب 9

import { getFunctions, httpsCallable } from "firebase/functions";

const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.
    /** @type {any} */
    const data = result.data;
    const sanitizedMessage = data.text;
  })
  .catch((error) => {
    // Getting the Error details.
    const code = error.code;
    const message = error.message;
    const details = error.details;
    // ...
  });

جاوا

addMessage(inputMessage)
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
                if (!task.isSuccessful()) {
                    Exception e = task.getException();
                    if (e instanceof FirebaseFunctionsException) {
                        FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
                        FirebaseFunctionsException.Code code = ffe.getCode();
                        Object details = ffe.getDetails();
                    }

                    // ...
                }

                // ...
            }
        });

Kotlin+KTX

addMessage(inputMessage)
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                val e = task.exception
                if (e is FirebaseFunctionsException) {
                    val code = e.code
                    val details = e.details
                }

                // ...
            }

            // ...
        })

C ++

void OnAddMessageCallback(
    const firebase::Future<firebase::functions::HttpsCallableResult>& future) {
  if (future.error() != firebase::functions::kErrorNone) {
    // Function error code, will be kErrorInternal if the failure was not
    // handled properly in the function call.
    auto code = static_cast<firebase::functions::Error>(future.error());

    // Display the error in the UI.
    DisplayError(code, future.error_message());
    return;
  }

  const firebase::functions::HttpsCallableResult *result = future.result();
  firebase::Variant data = result->data();
  // This will assert if the result returned from the function wasn't a string.
  std::string message = data.string_value();
  // Display the result in the UI.
  DisplayResult(message);
}

// ...

// ...
  auto future = AddMessage(message);
  future.OnCompletion(OnAddMessageCallback);
// ...

وحدت

 addMessage(text).ContinueWith((task) => {
  if (task.IsFaulted) {
    foreach (var inner in task.Exception.InnerExceptions) {
      if (inner is FunctionsException) {
        var e = (FunctionsException) inner;
        // Function error code, will be INTERNAL if the failure
        // was not handled properly in the function call.
        var code = e.ErrorCode;
        var message = e.ErrorMessage;
      }
    }
  } else {
    string result = task.Result;
  }
});

قبل از اینکه شما برنامه خود را راه اندازی، شما باید فعال برنامه را بررسی کنید به کمک اطمینان حاصل شود که تنها برنامه های خود را می توانید نقطه پایانی تابع callable خود دسترسی داشته باشید.