Cloud Functions के लिए https.onCall ट्रिगर, एचटीटीपीएस ट्रिगर होता है. इसमें अनुरोध और जवाब के लिए एक खास फ़ॉर्मैट होता है. इस सेक्शन में, क्लाइंट SDK (सॉफ़्टवेयर डेवलपमेंट किट) के ज़रिए इस्तेमाल किए जाने वाले एचटीटीपीएस अनुरोध और जवाब के फ़ॉर्मैट के बारे में बताया गया है. अगर Android, Apple प्लैटफ़ॉर्म या वेब एसडीके का इस्तेमाल करके आपकी ज़रूरतें पूरी नहीं हो पा रही हैं, तो यह जानकारी आपके लिए काम की हो सकती है.
अनुरोध का फ़ॉर्मैट: हेडर
कॉल किए जा सकने वाले ट्रिगर एंडपॉइंट पर एचटीटीपी अनुरोध, POST होना चाहिए. साथ ही, इसमें ये हेडर होने चाहिए:
- ज़रूरी है:
Content-Type: application/json; charset=utf-8को इस्तेमाल किया जा सकता है.
- ज़रूरी नहीं:
Authorization: Bearer <token>- अनुरोध करने वाले ऐसे उपयोगकर्ता के लिए Firebase Authentication यूज़र आईडी टोकन जिसने लॉग इन किया है. बैकएंड, इस टोकन की अपने-आप पुष्टि करता है और इसे हैंडलर के
contextमें उपलब्ध कराता है. अगर टोकन मान्य नहीं है, तो अनुरोध अस्वीकार कर दिया जाता है.
- अनुरोध करने वाले ऐसे उपयोगकर्ता के लिए Firebase Authentication यूज़र आईडी टोकन जिसने लॉग इन किया है. बैकएंड, इस टोकन की अपने-आप पुष्टि करता है और इसे हैंडलर के
- ज़रूरी नहीं:
Firebase-Instance-ID-Token: <iid>- यह Firebase client SDK से मिला FCM रजिस्ट्रेशन टोकन होता है. यह एक स्ट्रिंग होनी चाहिए. यह हैंडलर के
contextमें उपलब्ध है. इसका इस्तेमाल पुश नोटिफ़िकेशन को टारगेट करने के लिए किया जाता है.
- यह Firebase client SDK से मिला FCM रजिस्ट्रेशन टोकन होता है. यह एक स्ट्रिंग होनी चाहिए. यह हैंडलर के
- ज़रूरी नहीं:
X-Firebase-AppCheck: <token>- अनुरोध करने वाले क्लाइंट ऐप्लिकेशन से मिला Firebase App Check टोकन. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और इसे डिकोड करता है. साथ ही, हैंडलर के
contextमेंappIdको इंजेक्ट करता है. अगर टोकन की पुष्टि नहीं की जा सकती, तो अनुरोध को अस्वीकार कर दिया जाता है. (SDK >=3.14.0 के लिए उपलब्ध है)
- अनुरोध करने वाले क्लाइंट ऐप्लिकेशन से मिला Firebase App Check टोकन. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और इसे डिकोड करता है. साथ ही, हैंडलर के
अगर कोई दूसरा हेडर शामिल किया जाता है, तो अनुरोध अस्वीकार कर दिया जाता है. इसके बारे में, यहां दिए गए जवाब के दस्तावेज़ में बताया गया है.
ध्यान दें: JavaScript क्लाइंट में, ये अनुरोध सीओआरएस OPTIONS प्रीफ़्लाइट को ट्रिगर करते हैं, क्योंकि:
application/jsonकी अनुमति नहीं है. यहtext/plainयाapplication/x-www-form-urlencodedहोना चाहिए.Authorizationहेडर, CORS-safelisted request-header नहीं है.- इसी तरह, अन्य हेडर इस्तेमाल करने की अनुमति नहीं है.
कॉल किए जा सकने वाले ट्रिगर, इन OPTIONS अनुरोधों को अपने-आप हैंडल करते हैं.
अनुरोध का मुख्य भाग
एचटीटीपी अनुरोध का मुख्य हिस्सा, एक JSON ऑब्जेक्ट होना चाहिए. इसमें इनमें से कोई भी फ़ील्ड शामिल होना चाहिए:
- ज़रूरी है:
data- फ़ंक्शन में पास किया गया आर्ग्युमेंट. यह कोई मान्य JSON वैल्यू हो सकती है. यह नीचे बताए गए सीरियलाइज़ेशन फ़ॉर्मैट के हिसाब से, नेटिव JavaScript टाइप में अपने-आप डिकोड हो जाता है.
अगर अनुरोध में कोई अन्य फ़ील्ड मौजूद है, तो बैकएंड अनुरोध को गलत मानता है और उसे अस्वीकार कर देता है.
जवाब का फ़ॉर्मैट: स्टेटस कोड
ऐसे कई मामले हो सकते हैं जिनमें रिस्पॉन्स में गड़बड़ियों के लिए, अलग-अलग एचटीटीपी स्टेटस कोड और स्ट्रिंग स्टेटस कोड मिल सकते हैं.
अगर
clientट्रिगर होने से पहले एचटीटीपी गड़बड़ी होती है, तो रिस्पॉन्स को क्लाइंट फ़ंक्शन के तौर पर हैंडल नहीं किया जाता. उदाहरण के लिए, अगर कोई क्लाइंट ऐसे फ़ंक्शन को चालू करने की कोशिश करता है जो मौजूद नहीं है, तो उसे404 Not Foundजवाब मिलता है.अगर क्लाइंट ट्रिगर चालू हो जाता है, लेकिन अनुरोध गलत फ़ॉर्मैट में है, जैसे कि JSON फ़ॉर्मैट में नहीं है, अमान्य फ़ील्ड हैं या
dataफ़ील्ड मौजूद नहीं है, तो अनुरोध को400 Bad Requestके साथ अस्वीकार कर दिया जाता है. साथ ही, गड़बड़ी का कोडINVALID_ARGUMENTहोता है.अगर अनुरोध में दिया गया पुष्टि करने वाला टोकन अमान्य है, तो अनुरोध को
401 Unauthorizedके साथ अस्वीकार कर दिया जाता है. साथ ही, गड़बड़ी का कोडUNAUTHENTICATEDहोता है.अगर अनुरोध में दिया गया FCM रजिस्ट्रेशन टोकन अमान्य है, तो यह तय नहीं किया जा सकता कि क्या होगा. हर अनुरोध पर टोकन की जांच नहीं की जाती. हालांकि, जब इसका इस्तेमाल FCM के साथ पुश नोटिफ़िकेशन भेजने के लिए किया जाता है, तब इसकी जांच की जाती है.
अगर कॉल किए जा सकने वाले ट्रिगर को चालू किया जाता है, लेकिन वह हैंडल न की गई किसी अपवाद की वजह से काम नहीं करता है या प्रॉमिस पूरा नहीं करता है, तो अनुरोध को
500 Internal Server Errorके साथ अस्वीकार कर दिया जाता है. साथ ही, गड़बड़ी का कोडINTERNALदिखता है. इससे कोडिंग से जुड़ी गड़बड़ियों को गलती से असली उपयोगकर्ताओं के सामने आने से रोका जा सकता है.अगर कॉल किए जा सकने वाले फ़ंक्शन को शुरू किया जाता है और वह कॉल किए जा सकने वाले फ़ंक्शन के लिए उपलब्ध कराए गए एपीआई का इस्तेमाल करके, गड़बड़ी की स्थिति के बारे में साफ़ तौर पर बताता है, तो अनुरोध पूरा नहीं होगा. दिखाया गया एचटीटीपी स्टेटस कोड, गड़बड़ी के स्टेटस को एचटीटीपी स्टेटस से मैप करने के आधिकारिक तरीके पर आधारित होता है. इसके बारे में 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- अगर यह फ़ील्ड मौजूद है, तो अनुरोध को पूरा नहीं माना जाएगा. भले ही, एचटीटीपी स्टेटस कोड मौजूद हो याdataभी मौजूद हो. इस फ़ील्ड की वैल्यू, गड़बड़ियों के लिए स्टैंडर्ड Google Cloud HTTP मैपिंग फ़ॉर्मैट में JSON ऑब्जेक्ट होनी चाहिए. इसमेंstatus,message, और (ज़रूरी नहीं)detailsके लिए फ़ील्ड होने चाहिए.codeफ़ील्ड को शामिल नहीं किया जाना चाहिए. अगरstatusफ़ील्ड सेट नहीं है या इसकी वैल्यू अमान्य है, तो क्लाइंट को स्थिति कोINTERNALके तौर पर मानना चाहिए. यह code.proto के मुताबिक होना चाहिए. अगरdetailsमौजूद है, तो इसे क्लाइंट एसडीके में गड़बड़ी से जुड़ी उपयोगकर्ता की किसी भी जानकारी में शामिल किया जाता है. हालांकि, ऐसा तब किया जाता है, जब यह जानकारी लागू होती है.
ध्यान दें: यहांdetailsफ़ील्ड में, उपयोगकर्ता की ओर से दी गई वैल्यू मौजूद है. यह ज़रूरी नहीं है कि यह GoogleStatusफ़ॉर्मैट की तरह, प्रोटो टाइप के हिसाब से वैल्यू की सूची हो.result- फ़ंक्शन से मिली वैल्यू. यह कोई मान्य JSON वैल्यू हो सकती है. firebase-functions SDK, उपयोगकर्ता की ओर से दिखाई गई वैल्यू को इस JSON फ़ॉर्मैट में अपने-आप कोड में बदल देता है. क्लाइंट SDK, इन पैरामीटर को यहां बताए गए सीरियलाइज़ेशन फ़ॉर्मैट के हिसाब से, नेटिव टाइप में अपने-आप डिकोड कर देते हैं.
अगर अन्य फ़ील्ड मौजूद हैं, तो उन्हें अनदेखा किया जाना चाहिए.
सीरियलाइज़ेशन
अनचाहे डेटा पेलोड के लिए, क्रम से लगाने का फ़ॉर्मैट अनुरोध और जवाब, दोनों के लिए एक जैसा होता है.
प्लेटफ़ॉर्म पर एक जैसा अनुभव देने के लिए, इन्हें JSON में कोड किया जाता है. ऐसा इसलिए किया जाता है, ताकि ये proto3 प्रोटोकॉल बफ़र में मौजूद Any फ़ील्ड की वैल्यू की तरह दिखें. इसके लिए, स्टैंडर्ड JSON मैपिंग का इस्तेमाल किया जाता है. null, int, double या string जैसे सामान्य टाइप की वैल्यू को सीधे तौर पर एन्कोड किया जाता है. इनमें इनके टाइप शामिल नहीं होते. इसलिए, float और double को एक ही तरीके से कोड किया जाता है. साथ ही, आपको यह पता नहीं चल सकता कि कॉल के दूसरे छोर पर कौनसी इमोजी मिली है. JSON के नेटिव टाइप के अलावा अन्य टाइप के लिए, वैल्यू के लिए टाइप किया गया proto3 एन्कोडिंग इस्तेमाल किया जाता है. ज़्यादा जानकारी के लिए, Any JSON encoding के लिए दस्तावेज़ देखें.
इन टाइप के विज्ञापन दिखाने की अनुमति है:
- शून्य -
null - int (signed या unsigned, ज़्यादा से ज़्यादा 32 बिट) - उदाहरण के लिए,
3या-30. - फ़्लोट - उदाहरण के लिए,
3.14 - दोहरा - उदाहरण के लिए,
3.14 - बूलियन -
trueयाfalse - string - e.g.
"hello world" - map<string, any=""> - e.g.
{"x": 3}</string,> - list
- e.g. [1, 2, 3] - long (signed or unsigned, up to 64 bits) - [see below for details]
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 फ़ील्ड होता है, तो उसे मैप के तौर पर छोड़ दिया जाता है. इससे डेवलपर, पुरानी क्लाइंट लाइब्रेरी को बदले बिना, रिटर्न वैल्यू में नए टाइप के फ़ील्ड जोड़ सकते हैं.
कोड सैंपल
इस सेक्शन में दिए गए सैंपल से, यहां दी गई चीज़ों को एन्कोड करने का तरीका पता चलता है:
- Swift में 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"
}
}
}
कोड में बदलने के लिए जवाब
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"
}
}
}