یک راهانداز https.onCall
برای توابع ابری یک راهانداز HTTPS با فرمت خاصی برای درخواست و پاسخ است. این بخش مشخصاتی را برای فرمت های درخواست و پاسخ HTTPS که توسط SDK های مشتری برای پیاده سازی API استفاده می شود، ارائه می دهد. این اطلاعات ممکن است برای شما مفید باشد اگر نیازهای شما با استفاده از پلتفرمهای Android، Apple یا وب SDK برآورده نشود.
فرمت درخواست: سرصفحه
درخواست HTTP به نقطه پایانی تریگر قابل فراخوانی باید یک POST
با هدرهای زیر باشد:
- مورد نیاز:
Content-Type: application/json
- اختیاری
; charset=utf-8
مجاز است.
- اختیاری
- اختیاری:
Authorization: Bearer <token>
- یک کد شناسه کاربری Firebase Authentication برای کاربر وارد شده درخواستی. پشتیبان به طور خودکار این نشانه را تأیید می کند و آن را در
context
کنترل کننده در دسترس قرار می دهد. اگر توکن معتبر نباشد، درخواست رد می شود.
- یک کد شناسه کاربری Firebase Authentication برای کاربر وارد شده درخواستی. پشتیبان به طور خودکار این نشانه را تأیید می کند و آن را در
- اختیاری:
Firebase-Instance-ID-Token: <iid>
- رمز ثبت FCM از SDK مشتری Firebase. این باید یک رشته باشد. این در
context
کنترل کننده موجود است. برای هدف قرار دادن اعلان های فشار استفاده می شود.
- رمز ثبت FCM از SDK مشتری Firebase. این باید یک رشته باشد. این در
- اختیاری:
X-Firebase-AppCheck: <token>
- نشانه بررسی برنامه Firebase که توسط برنامه مشتری درخواست کننده ارائه شده است. Backend به طور خودکار این نشانه را تأیید می کند و آن را رمزگشایی می کند و
appId
درcontext
کنترل کننده تزریق می کند. اگر رمز قابل تأیید نباشد، درخواست رد می شود. (در دسترس برای SDK >=3.14.0)
- نشانه بررسی برنامه Firebase که توسط برنامه مشتری درخواست کننده ارائه شده است. Backend به طور خودکار این نشانه را تأیید می کند و آن را رمزگشایی می کند و
اگر سرصفحه دیگری گنجانده شود، درخواست رد می شود، همانطور که در مستندات پاسخ زیر توضیح داده شده است.
توجه: در کلاینتهای جاوا اسکریپت، این درخواستها پیش از پرواز CORS OPTIONS
را راهاندازی میکنند، زیرا:
-
application/json
مجاز نیست. بایدtext/plain
یاapplication/x-www-form-urlencoded
باشد. - سرصفحه
Authorization
یک سرصفحه درخواست ایمن شده توسط CORS نیست. - سرصفحه های دیگر به طور مشابه مجاز نیستند.
ماشه قابل فراخوانی به طور خودکار این درخواست های OPTIONS
را مدیریت می کند.
درخواست بدن
بدنه درخواست HTTP باید یک شی JSON با هر یک از فیلدهای زیر باشد:
- مورد نیاز:
data
- آرگومان ارسال شده به تابع. این می تواند هر مقدار JSON معتبر باشد. این به طور خودکار به انواع جاوا اسکریپت بومی با توجه به فرمت سریالسازی شرح داده شده در زیر رمزگشایی میشود.
اگر فیلدهای دیگری در درخواست وجود داشته باشد، باطن درخواست را نادرست میداند و رد میشود.
قالب پاسخ: کدهای وضعیت
چندین مورد وجود دارد که می تواند منجر به کدهای وضعیت HTTP مختلف و کدهای وضعیت رشته برای خطا در پاسخ شود.
در مورد خطای HTTP قبل از فراخوانی تریگر
client
، پاسخ به عنوان یک تابع کلاینت بررسی نمی شود. به عنوان مثال، اگر یک کلاینت سعی کند یک تابع ناموجود را فراخوانی کند، یک پاسخ404 Not Found
دریافت می کند.اگر راهانداز کلاینت فراخوانی شده باشد، اما فرمت درخواست اشتباه باشد، مانند JSON نبودن، فیلدهای نامعتبر یا عدم وجود فیلد
data
، درخواست با400 Bad Request
با کد خطاINVALID_ARGUMENT
رد میشود.اگر رمز تأیید ارائه شده در درخواست نامعتبر باشد، درخواست با
401 Unauthorized
رد می شود، با کد خطاUNAUTHENTICATED
.اگر رمز ثبت FCM ارائه شده در درخواست نامعتبر باشد، رفتار تعریف نشده است. توکن در هر درخواستی بررسی نمی شود، مگر زمانی که از آن برای ارسال اعلان فشار با FCM استفاده می شود.
اگر تریگر قابل فراخوانی فراخوانی شود، اما با یک استثنا کنترل نشده شکست بخورد یا یک وعده ناموفق را برگرداند، درخواست با
500 Internal Server Error
با کد خطاINTERNAL
رد می شود. این مانع از قرار گرفتن تصادفی خطاهای کدنویسی در معرض کاربران نهایی می شود.اگر فراخوانی فراخوانی شود و با استفاده از API ارائه شده برای توابع قابل فراخوانی، یک شرط خطای صریح را برگرداند، آنگاه درخواست با شکست مواجه می شود. کد وضعیت HTTP برگردانده شده بر اساس نگاشت رسمی وضعیت خطا به وضعیت HTTP است، همانطور که در code.proto تعریف شده است. کد خطای خاص، پیام و جزئیات بازگردانده شده در بدنه پاسخ به شرح زیر کدگذاری می شوند. این بدان معنی است که اگر تابع یک خطای صریح را با وضعیت
OK
برگرداند، پاسخ دارای وضعیت200 OK
است، اما فیلدerror
در پاسخ تنظیم می شود.اگر راهانداز مشتری موفقیت آمیز باشد، وضعیت پاسخ
200 OK
است.
قالب پاسخ: سرصفحه
پاسخ دارای سرفصل های زیر است:
-
Content-Type: application/json
- اختیاری
; charset=utf-8
مجاز است.
بدن پاسخگو
پاسخ از نقطه پایانی مشتری همیشه یک شی JSON است. حداقل شامل result
یا error
به همراه هر فیلد اختیاری است. اگر پاسخ یک شی JSON نیست، یا حاوی data
یا error
نیست، SDK سرویس گیرنده باید با کد خطای Google INTERNAL (13)
درخواست را به عنوان ناموفق تلقی کند.
-
error
- اگر این فیلد وجود داشته باشد، بدون در نظر گرفتن کد وضعیت HTTP یا اینکه آیاdata
نیز وجود دارد، درخواست ناموفق در نظر گرفته می شود. مقدار این فیلد باید یک شی JSON در قالب استاندارد Google Cloud HTTP Mapping برای خطاها باشد، با فیلدهایی برایstatus
،message
وdetails
(به صورت اختیاری). فیلدcode
نباید گنجانده شود. اگر فیلدstatus
تنظیم نشده باشد یا یک مقدار نامعتبر باشد، مشتری باید وضعیت را مطابق با code.proto به عنوانINTERNAL
تلقی کند. اگرdetails
وجود داشته باشد، در صورت وجود، در هر اطلاعات کاربری پیوست شده به خطا در SDK کلاینت گنجانده می شود.
توجه: فیلدdetails
در اینجا یک مقدار ارائه شده توسط کاربر است. این لزوماً فهرستی از مقادیر کلید شده بر اساس نوع پروتو مانند قالب GoogleStatus
نیست. -
result
- مقدار بازگشتی توسط تابع. این می تواند هر مقدار JSON معتبر باشد. Firebase-functions SDK به طور خودکار مقدار بازگردانده شده توسط کاربر را در قالب JSON رمزگذاری می کند. SDK های مشتری به طور خودکار این پارامترها را به انواع بومی با توجه به فرمت سریال سازی که در زیر توضیح داده شده است رمزگشایی می کنند.
در صورت وجود فیلدهای دیگر، باید آنها را نادیده گرفت.
سریال سازی
فرمت سریال سازی برای بارهای داده دلخواه هم برای درخواست و هم برای پاسخ یکسان است.
برای سازگاری پلتفرم، اینها در JSON به گونهای کدگذاری میشوند که گویی مقدار یک فیلد Any
در بافر پروتکل پروتکل ۳ هستند، با استفاده از نگاشت استاندارد JSON . مقادیر انواع ساده مانند null
، int
، double
یا string
مستقیماً کدگذاری می شوند و نوع صریح آنها را شامل نمی شود. بنابراین، یک float
و double
به یک شکل رمزگذاری میشوند و ممکن است ندانید کدام یک از طرف دیگر تماس دریافت میشود. برای انواعی که بومی JSON نیستند، از کدگذاری تایپ شده proto3 برای مقدار استفاده می شود. برای اطلاعات بیشتر، به مستندات مربوط به هر کدگذاری JSON مراجعه کنید.
انواع زیر مجاز است:
- پوچ -
null
- int (امضا یا بدون علامت، تا 32 بیت) - به عنوان مثال
3
یا-30
. - شناور - به عنوان مثال
3.14
- دو برابر - به عنوان مثال
3.14
- بولی -
true
یاfalse
- رشته - به عنوان مثال
"hello world"
- نقشه
- به عنوان مثال {"x": 3}
- فهرست
- به عنوان مثال [1, 2, 3]
- طولانی (امضا یا بدون امضا، تا 64 بیت) - [برای جزئیات به زیر مراجعه کنید]
مقادیر NaN
و Infinity
برای float
و double
پشتیبانی نمی شوند.
توجه داشته باشید که long
نوع خاصی است که معمولاً در JSON مجاز نیست، اما توسط مشخصات proto3 پوشش داده می شود. به عنوان مثال، اینها به صورت زیر کدگذاری می شوند:
طولانی
{
'@type': 'type.googleapis.com/google.protobuf.Int64Value',
'value': '-123456789123456'
}
بدون امضا طولانی
{
'@type': 'type.googleapis.com/google.protobuf.UInt64Value',
'value': '123456789123456'
}
به طور کلی، کلید @type
باید رزرو شده در نظر گرفته شود و برای نقشههای ارسال شده استفاده نشود.
از آنجایی که نوع برای انواع ساده مشخص نشده است، برخی از مقادیر پس از عبور از روی سیم تغییر نوع می دهند. یک float
عبور داده شده به یک double
تبدیل می شود. short
به int
تبدیل می شود و غیره. در اندروید، هر دو List
و JSONArray
برای مقادیر لیست پشتیبانی می شوند. در این موارد، عبور از JSONArray یک List
به دست می دهد.
اگر نقشه ای با یک فیلد @type
ناشناخته از سریال خارج شود، به عنوان نقشه باقی می ماند. این به توسعه دهندگان اجازه می دهد تا فیلدهایی را با انواع جدید به مقادیر بازگشتی خود بدون شکستن مشتریان قدیمی اضافه کنند.
نمونه کد
نمونه های موجود در این بخش نحوه رمزگذاری موارد زیر را نشان می دهند:
- یک مثال callable.call در سوئیفت
- پاسخ موفقیت آمیز برای تماس
- پاسخ ناموفق برای تماس
مثال Callable.call در سوئیفت برای رمزگذاری
callable.call([
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": -123456789123456 as Int64
])
سربرگ درخواست:
Method: POST
Content-Type: application/json; charset=utf-8
Authorization: Bearer some-auth-token
Firebase-Instance-ID-Token: some-iid-token
بدن درخواستی:
{
"data": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": {
"@type": "type.googleapis.com/google.protobuf.Int64Value",
"value": "-123456789123456"
}
}
}
پاسخ به رمزگذاری
return {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
};
هدر پاسخ موفق:
200 OK
Content-Type: application/json; charset=utf-8
بدن پاسخگوی موفق:
{
"response": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
}
}
پاسخ ناموفق به رمزگذاری
throw new HttpsError("unauthenticated", "Request had invalid credentials.", {
"some-key": "some-value"
});
سرصفحه پاسخ ناموفق:
401 UNAUTHENTICATED
Content-Type: application/json; charset=utf-8
بدنه پاسخ ناموفق:
{
"error": {
"message": "Request had invalid credentials.",
"status": "UNAUTHENTICATED",
"details": {
"some-key": "some-value"
}
}
}