https.onCall के लिए प्रोटोकॉल से जुड़ी ज़रूरी शर्तें

Cloud Functions के लिए https.onCall ट्रिगर, एचटीटीपीएस ट्रिगर होता है. इसमें अनुरोध और रिस्पॉन्स के लिए, एक खास फ़ॉर्मैट होता है. इस सेक्शन में क्लाइंट SDK टूल में इस्तेमाल किए जाने वाले एचटीटीपीएस अनुरोध और रिस्पॉन्स फ़ॉर्मैट के लिए खास जानकारी एपीआई लागू करने के लिए. अगर ज़रूरी हो, तो यह जानकारी आपके काम की हो सकती है को Android, Apple प्लैटफ़ॉर्म या वेब SDK टूल का इस्तेमाल करके पूरा नहीं किया जा सकता.

अनुरोध का फ़ॉर्मैट: हेडर

कॉल किए जा सकने वाले ट्रिगर एंडपॉइंट के लिए एचटीटीपी अनुरोध, POST होना चाहिए. साथ ही, उसमें ये हेडर होने चाहिए:

  • ज़रूरी है: Content-Type: application/json
    • ; charset=utf-8 को इस्तेमाल किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
  • ज़रूरी नहीं: Authorization: Bearer <token>
    • अनुरोध करने वाले लॉग इन किए हुए उपयोगकर्ता के लिए Firebase Authentication यूज़र आईडी टोकन. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और इसे हैंडलर के context में उपलब्ध कराता है. अगर टोकन मान्य नहीं है, तो अनुरोध अस्वीकार कर दिया जाता है.
  • ज़रूरी नहीं: Firebase-Instance-ID-Token: <iid>
    • Firebase क्लाइंट SDK टूल से मिला FCM रजिस्ट्रेशन टोकन. यह स्ट्रिंग होनी चाहिए. यह हैंडलर के context में उपलब्ध है. इसका इस्तेमाल पुश नोटिफ़िकेशन को टारगेट करने के लिए किया जाता है.
  • ज़रूरी नहीं: X-Firebase-AppCheck: <token>
    • Firebase ऐप्लिकेशन चेक टोकन, जो क्लाइंट ऐप्लिकेशन से मिला है अनुरोध. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और उसे डिकोड करता है. साथ ही, हैंडलर के context में appId को इंजेक्ट करता है. अगर टोकन की पुष्टि नहीं की जा सकती है, तो अनुरोध अस्वीकार कर दिया जाता है. (SDK टूल >=3.14.0 के लिए उपलब्ध)

अगर कोई अन्य हेडर शामिल किया जाता है, तो अनुरोध अस्वीकार कर दिया जाता है. इस बारे में, यहां दिए गए रिस्पॉन्स दस्तावेज़ में बताया गया है.

ध्यान दें: JavaScript क्लाइंट में, ये अनुरोध सीओआरएस OPTIONS प्रीफ़्लाइट को ट्रिगर करते हैं, क्योंकि:

कॉल करने लायक ट्रिगर इन OPTIONS अनुरोधों को अपने-आप मैनेज करता है.

अनुरोध का मुख्य भाग

एचटीटीपी अनुरोध का मुख्य हिस्सा एक JSON ऑब्जेक्ट होना चाहिए, जिसमें इनमें से कोई भी फ़ील्ड हो:

  • ज़रूरी: data - फ़ंक्शन में पास किया गया आर्ग्युमेंट. यह कोई भी मान्य JSON वैल्यू हो सकती है. इसे नीचे बताए गए सीरियलाइज़ेशन फ़ॉर्मैट के मुताबिक, नेटिव JavaScript टाइप में अपने-आप डिकोड कर दिया जाता है.

अगर अनुरोध में कोई अन्य फ़ील्ड मौजूद है, तो बैकएंड उसे गलत फ़ॉर्मैट वाला अनुरोध मानता है और उसे अस्वीकार कर देता है.

रिस्पॉन्स फ़ॉर्मैट: स्टेटस कोड

ऐसे कई मामले हैं जिनकी वजह से अलग-अलग एचटीटीपी स्टेटस कोड दिख सकते हैं और गड़बड़ी के लिए स्ट्रिंग स्थिति कोड डालें.

  1. client ट्रिगर होने से पहले एचटीटीपी गड़बड़ी होने पर, रिस्पॉन्स को क्लाइंट फ़ंक्शन के तौर पर मैनेज नहीं किया जाता. उदाहरण के लिए, अगर कोई क्लाइंट किसी ऐसे फ़ंक्शन को कॉल करने की कोशिश करता है जो मौजूद नहीं है, तो उसे 404 Not Found रिस्पॉन्स मिलता है.

  2. अगर क्लाइंट ट्रिगर को शुरू किया जाता है, लेकिन अनुरोध गलत फ़ॉर्मैट में है, जैसे कि JSON नहीं होना, अमान्य फ़ील्ड होना या data फ़ील्ड मौजूद न होना, तो अनुरोध को 400 Bad Request के गड़बड़ी कोड के साथ INVALID_ARGUMENT से अस्वीकार कर दिया जाता है.

  3. अगर अनुरोध में दिया गया पुष्टि करने वाला टोकन अमान्य है, तो अनुरोध को 401 Unauthorized के साथ अस्वीकार कर दिया जाता है. साथ ही, गड़बड़ी का कोड UNAUTHENTICATED दिखता है.

  4. अगर अनुरोध में दिया गया FCM रजिस्ट्रेशन टोकन अमान्य है, तो व्यवहार के बारे में नहीं बताया जाता. टोकन की जांच हर अनुरोध पर नहीं की जाती है. हालांकि, FCM के साथ पुश नोटिफ़िकेशन भेजने के लिए इसका इस्तेमाल किया जाता है.

  5. अगर कॉल किए जा सकने वाले ट्रिगर को ट्रिगर किया जाता है, लेकिन वह बिना मैनेज किए गए अपवाद की वजह से काम नहीं करता या कोई गड़बड़ी वाला प्रॉमिस दिखाता है, तो अनुरोध को 500 Internal Server Error के साथ अस्वीकार कर दिया जाता है. साथ ही, गड़बड़ी का कोड INTERNAL दिखाया जाता है. इससे, कोडिंग से जुड़ी गड़बड़ियां गलती से असली उपयोगकर्ताओं को दिखने से बचती हैं.

  6. अगर कॉल किए जा सकने वाले फ़ंक्शन को शुरू किया जाता है और कॉल करने लायक फ़ंक्शन के लिए दिए गए एपीआई का इस्तेमाल करके, गड़बड़ी की साफ़ तौर पर जानकारी देता है, तो अनुरोध पूरा नहीं होता. आपको जो एचटीटीपी स्टेटस कोड मिला है वह code.proto के मुताबिक, गड़बड़ी की स्थिति और एचटीटीपी स्थिति की आधिकारिक मैपिंग पर आधारित है. गड़बड़ी के खास कोड, मैसेज, और दी गई जानकारी को जवाब के मुख्य हिस्से में एन्कोड किया जाता है. इस बारे में यहां जानकारी दी गई है. इसका मतलब है कि अगर फ़ंक्शन, स्टेटस OK के साथ साफ़ तौर पर गड़बड़ी दिखाता है, तो रिस्पॉन्स की स्थिति 200 OK होती है, लेकिन रिस्पॉन्स में error फ़ील्ड सेट होता है.

  7. अगर क्लाइंट ट्रिगर कामयाब होता है, तो रिस्पॉन्स का स्टेटस 200 OK होगा.

रिस्पॉन्स का फ़ॉर्मैट: हेडर

रिस्पॉन्स में ये हेडर होते हैं:

  • Content-Type: application/json
  • एक वैकल्पिक ; charset=utf-8 की अनुमति है.

जवाब का लेख

क्लाइंट एंडपॉइंट से मिलने वाला रिस्पॉन्स हमेशा JSON ऑब्जेक्ट होता है. इसमें कम से कम result या error के साथ-साथ, वैकल्पिक फ़ील्ड भी शामिल होते हैं. अगर रिस्पॉन्स, JSON ऑब्जेक्ट नहीं है या उसमें data या error शामिल नहीं है, क्लाइंट SDK टूल को अनुरोध 'स्वीकार नहीं किया जा सका' के तौर पर मानना चाहिए Google गड़बड़ी कोड INTERNAL (13) है.

  • error - अगर यह फ़ील्ड मौजूद है, तो एचटीटीपी स्टेटस कोड या data भी मौजूद है या नहीं, इस पर ध्यान दिए बिना अनुरोध को पूरा नहीं किया जा सकता. गड़बड़ियों के लिए इस फ़ील्ड की वैल्यू, स्टैंडर्ड Google Cloud एचटीटीपी मैपिंग फ़ॉर्मैट में एक JSON ऑब्जेक्ट होना चाहिए. इसमें status, message, और (ज़रूरी नहीं) details के लिए फ़ील्ड मौजूद होने चाहिए. code फ़ील्ड को शामिल नहीं किया जाएगा. अगर status फ़ील्ड सेट नहीं है या इसकी वैल्यू अमान्य है, तो क्लाइंट को code.proto के मुताबिक, स्थिति को INTERNAL के तौर पर दिखाना चाहिए. अगर details मौजूद है, तो इसे क्लाइंट SDK टूल में गड़बड़ी के साथ अटैच की गई किसी भी उपयोगकर्ता की जानकारी में शामिल किया जाता है.
    ध्यान दें: यहां details फ़ील्ड में उपयोगकर्ता की दी गई वैल्यू होती है. यह ज़रूरी नहीं है कि यह Google Status फ़ॉर्मैट की तरह, प्रोटो टाइप के हिसाब से की गई वैल्यू की सूची हो.
  • result - फ़ंक्शन से मिली वैल्यू. यह कोई भी मान्य JSON वैल्यू हो सकती है. firebase-Functions SDK टूल, उपयोगकर्ता से मिली वैल्यू को इस JSON फ़ॉर्मैट में अपने-आप कोड में बदल देता है. क्लाइंट SDK टूल, नीचे बताए गए सीरियलाइज़ेशन फ़ॉर्मैट के मुताबिक, इन पैरामीटर को नेटिव टाइप में अपने-आप डिकोड कर देते हैं.

अगर अन्य फ़ील्ड मौजूद हैं, तो उन्हें अनदेखा कर दिया जाना चाहिए.

सीरियलाइज़ेशन

अनुरोध और जवाब, दोनों के लिए डेटा पेलोड का सीरियलाइज़ेशन फ़ॉर्मैट एक जैसा होता है.

प्लैटफ़ॉर्म पर एक जैसी वैल्यू देने के लिए, इन्हें JSON में कोड में बदला जाता है. ऐसा करने के लिए, स्टैंडर्ड JSON मैपिंग का इस्तेमाल किया जाता है. ऐसा इसलिए किया जाता है, ताकि ये वैल्यू, proto3 प्रोटोकॉल बफ़र में मौजूद Any फ़ील्ड की वैल्यू की तरह काम कर सकें. null, int, double या string जैसे सिंपल टाइप की वैल्यू को सीधे तौर पर एन्कोड किया जाता है. साथ ही, इनमें उनके टाइप की जानकारी शामिल नहीं होती. इसलिए, float और double को एक ही तरह से कोड में बदला जाता है और हो सकता है कि आपको यह पता न चले कि कॉल के आखिर में कौनसा मिला. जो टाइप JSON में शामिल नहीं हैं उनके लिए, वैल्यू के लिए टाइप किए गए प्रोटो3 एन्कोडिंग का इस्तेमाल किया जाता है. ज़्यादा जानकारी के लिए, किसी भी JSON कोडिंग के लिए दस्तावेज़ देखें.

इस तरह के विज्ञापन दिखाए जा सकते हैं:

  • खाली - null
  • int (साइन वाला या बिना साइन वाला, ज़्यादा से ज़्यादा 32 बिट) - उदाहरण के लिए, 3 या -30.
  • फ़्लोट - उदाहरण के लिए, 3.14
  • डबल - जैसे कि 3.14 अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • बूलियन - true या false
  • स्ट्रिंग - उदाहरण के लिए, "hello world"
  • map<string, any=""> - उदाहरण के लिए, {"x": 3}</string,>
  • list - उदाहरण के लिए, [1, 2, 3]
  • long (साइन किया गया या बिना साइन वाला, ज़्यादा से ज़्यादा 64 बिट) - [ज़्यादा जानकारी के लिए नीचे देखें]

float और double के लिए, NaN और Infinity वैल्यू का इस्तेमाल नहीं किया जा सकता.

ध्यान दें कि 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 हो जाता है. इसी तरह, आगे की दर भी इसी हिसाब से तय होगी. Android में, सूची की वैल्यू के लिए List और JSONArray, दोनों का इस्तेमाल किया जा सकता है. उन मामलों में, JSONArray में पास करने से List मिलेगा.

अगर किसी ऐसे मैप को डीसीरीयलाइज़ किया जाता है जिसमें @type फ़ील्ड मौजूद नहीं है, तो उसे मैप के तौर पर ही छोड़ दिया जाता है. इससे डेवलपर, पुराने क्लाइंट को मिटाए बिना, रिटर्न वैल्यू में नए टाइप वाले फ़ील्ड जोड़ सकते हैं.

कोड सैंपल

इस सेक्शन में दिए गए सैंपल से, इन चीज़ों को कोड में बदलने का तरीका पता चलता है:

  • स्विफ़्ट में callable.call का उदाहरण
  • कॉल के लिए सफलता का जवाब
  • कॉल के लिए गड़बड़ी का जवाब

कोड को एन्क्रिप्ट करने के लिए, Swift में 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"
        }
    }
}

Response to encode

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"
        }
    }
}