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
वाली गड़बड़ी दिखाता है, तो जवाब का स्टेटसOK
होता है. हालांकि, जवाब मेंerror
फ़ील्ड सेट होता है.200 OK
अगर क्लाइंट ट्रिगर करने का अनुरोध पूरा हो जाता है, तो जवाब की स्थिति
200 OK
होती है.
रिस्पॉन्स का फ़ॉर्मैट: हेडर
रिस्पॉन्स में ये हेडर मौजूद हैं:
Content-Type: application/json
; charset=utf-8
का इस्तेमाल करना ज़रूरी नहीं है.
जवाब का लेख
क्लाइंट एंडपॉइंट से मिलने वाला रिस्पॉन्स हमेशा एक JSON ऑब्जेक्ट होता है. इसमें कम से कम result
या error
के साथ-साथ, कोई भी ज़रूरी नहीं वाला फ़ील्ड शामिल होता है. अगर जवाब JSON ऑब्जेक्ट नहीं है या इसमें data
या error
शामिल नहीं है, तो क्लाइंट SDK को अनुरोध को Google के गड़बड़ी कोड INTERNAL (13)
के साथ फ़ेल के तौर पर मार्क करना चाहिए.
error
- अगर यह फ़ील्ड मौजूद है, तो अनुरोध को पूरा नहीं माना जाएगा. भले ही, एचटीटीपी स्टेटस कोड मौजूद हो याdata
भी मौजूद हो. इस फ़ील्ड की वैल्यू, गड़बड़ियों के लिए स्टैंडर्ड Google Cloud HTTP Mapping फ़ॉर्मैट में 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"
}
}
}