Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

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

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

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

  • با قابلیت تماس ، رمزهای تأیید Firebase و FCM ، در صورت وجود ، به طور خودکار در درخواست ها گنجانده می شوند.
  • functions.https.onCall https.onCall به طور خودکار متن درخواست را برطرف می کند و نشانه های تأیید را تأیید می کند.

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

  • Firebase SDK برای iOS 7.1.0
  • Firebase SDK برای آندروید 19.1.0
  • Firebase JavaScript SDK 8.1.1

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

عملکرد قابل فراخوانی را بنویسید و پیاده سازی کنید

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

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

به عنوان مثال ، برای یک عملکرد قابل فراخوانی که پیام متنی را در پایگاه داده Realtime data می data ، 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 .https.HttpsError خطاهای موجود در یک تماس را بازگردانید. این خطا دارای یک ویژگی code است که می تواند یکی از مقادیر ذکر شده در functions.https.HttpsError . 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 ، همراه با سایر توابع firebase deploy . برای استقرار فقط موارد قابل --only ، از آرگومان - فقط همانطور که نشان داده شده است برای اجرای --only جزئی استفاده کنید :

$ firebase deploy --only functions:addMessage

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

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

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

iOS

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

وب

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

Cloud Functions SDK به صورت بسته npm نیز موجود است.

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

جاوا

  1. برای افزودن Firebase به برنامه Android خود ، دستورالعمل ها را دنبال کنید.
  2. در سطح پروژه خود را build.gradle فایل، مطمئن شوید که شامل مخزن Maven را گوگل در هر دو خود را buildscript و allprojects بخش.
  3. وابستگی کتابخانه Android Cloud Functions را به ماژول خود اضافه کنید (سطح برنامه) پرونده Gradle (معمولاً app/build.gradle ):
    implementation 'com.google.firebase:firebase-functions:19.1.0'
    

کوتلین + KTX

  1. برای افزودن Firebase به برنامه Android خود ، دستورالعمل ها را دنبال کنید.
  2. در سطح پروژه خود را build.gradle فایل، مطمئن شوید که شامل مخزن Maven را گوگل در هر دو خود را buildscript و allprojects بخش.
  3. وابستگی کتابخانه Android Cloud Functions را به ماژول خود اضافه کنید (سطح برنامه) پرونده Gradle (معمولاً app/build.gradle ):
    implementation 'com.google.firebase:firebase-functions:19.1.0'
    

++ C

برای ++ C با Android :

  1. برای افزودن Firebase به پروژه ++ C خود ، دستورالعمل ها را دنبال کنید.
  2. در سطح پروژه خود را build.gradle فایل، مطمئن شوید که شامل مخزن Maven را گوگل در هر دو خود را buildscript و allprojects بخش.
  3. کتابخانه firebase_functions به پرونده CMakeLists.txt خود اضافه کنید.

برای C ++ با iOS :

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

وحدت

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

شروع SDK مشتری

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

سریع

lazy var functions = Functions.functions()

هدف-C

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

وب

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

جاوا

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

کوتلین + 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 text = (result?.data as? [String: Any])?["text"] as? String {
    self.resultField.text = text
  }
}

هدف-C

[[_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"];
}];

وب

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({text: messageText}).then(function(result) {
  // Read result of the Cloud Function.
  var sanitizedMessage = result.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;
                }
            });
}

کوتلین + 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]
  }
  // ...
}

هدف-C

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

وب

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

                    // ...
                }

                // ...
            }
        });

کوتلین + 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;
  }
});