Cloud Functions के लिए https.onCall
ट्रिगर, एचटीटीपीएस ट्रिगर होता है. इसमें अनुरोध और रिस्पॉन्स के लिए, एक खास फ़ॉर्मैट होता है. इस सेक्शन में
क्लाइंट SDK टूल में इस्तेमाल किए जाने वाले एचटीटीपीएस अनुरोध और रिस्पॉन्स फ़ॉर्मैट के लिए खास जानकारी
एपीआई लागू करने के लिए. अगर ज़रूरी हो, तो यह जानकारी आपके काम की हो सकती है
को Android, Apple प्लैटफ़ॉर्म या वेब SDK टूल का इस्तेमाल करके पूरा नहीं किया जा सकता.
अनुरोध का फ़ॉर्मैट: हेडर
कॉल किए जा सकने वाले ट्रिगर एंडपॉइंट के लिए एचटीटीपी अनुरोध, POST
होना चाहिए. साथ ही, उसमें ये हेडर होने चाहिए:
- ज़रूरी है:
Content-Type: application/json
; charset=utf-8
को इस्तेमाल किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
- ज़रूरी नहीं:
Authorization: Bearer <token>
- अनुरोध करने वाले लॉग इन किए हुए उपयोगकर्ता के लिए Firebase Authentication यूज़र आईडी टोकन. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और इसे हैंडलर के
context
में उपलब्ध कराता है. अगर टोकन मान्य नहीं है, तो अनुरोध अस्वीकार कर दिया जाता है.
- अनुरोध करने वाले लॉग इन किए हुए उपयोगकर्ता के लिए Firebase Authentication यूज़र आईडी टोकन. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और इसे हैंडलर के
- ज़रूरी नहीं:
Firebase-Instance-ID-Token: <iid>
- Firebase क्लाइंट SDK टूल से मिला FCM रजिस्ट्रेशन टोकन. यह स्ट्रिंग होनी चाहिए. यह हैंडलर के
context
में उपलब्ध है. इसका इस्तेमाल पुश नोटिफ़िकेशन को टारगेट करने के लिए किया जाता है.
- Firebase क्लाइंट SDK टूल से मिला FCM रजिस्ट्रेशन टोकन. यह स्ट्रिंग होनी चाहिए. यह हैंडलर के
- ज़रूरी नहीं:
X-Firebase-AppCheck: <token>
- Firebase ऐप्लिकेशन चेक टोकन, जो क्लाइंट ऐप्लिकेशन से मिला है
अनुरोध. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और उसे डिकोड करता है. साथ ही, हैंडलर के
context
मेंappId
को इंजेक्ट करता है. अगर टोकन की पुष्टि नहीं की जा सकती है, तो अनुरोध अस्वीकार कर दिया जाता है. (SDK टूल >=3.14.0 के लिए उपलब्ध)
- Firebase ऐप्लिकेशन चेक टोकन, जो क्लाइंट ऐप्लिकेशन से मिला है
अनुरोध. बैकएंड इस टोकन की पुष्टि अपने-आप करता है और उसे डिकोड करता है. साथ ही, हैंडलर के
अगर कोई अन्य हेडर शामिल किया जाता है, तो अनुरोध अस्वीकार कर दिया जाता है. इस बारे में, यहां दिए गए रिस्पॉन्स दस्तावेज़ में बताया गया है.
ध्यान दें: JavaScript क्लाइंट में, ये अनुरोध सीओआरएस OPTIONS
प्रीफ़्लाइट को ट्रिगर करते हैं, क्योंकि:
application/json
की अनुमति नहीं है. यहtext/plain
याapplication/x-www-form-urlencoded
होनी चाहिए.Authorization
हेडर, सीओआरएस सेफ़लिस्ट किया गया रिक्वेस्ट-हेडर नहीं है.- दूसरे हेडर की भी अनुमति नहीं है.
कॉल करने लायक ट्रिगर इन 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 एचटीटीपी मैपिंग फ़ॉर्मैट में एक JSON ऑब्जेक्ट होना चाहिए. इसमेंstatus
,message
, और (ज़रूरी नहीं)details
के लिए फ़ील्ड मौजूद होने चाहिए.code
फ़ील्ड को शामिल नहीं किया जाएगा. अगरstatus
फ़ील्ड सेट नहीं है या इसकी वैल्यू अमान्य है, तो क्लाइंट को code.proto के मुताबिक, स्थिति कोINTERNAL
के तौर पर दिखाना चाहिए. अगरdetails
मौजूद है, तो इसे क्लाइंट SDK टूल में गड़बड़ी के साथ अटैच की गई किसी भी उपयोगकर्ता की जानकारी में शामिल किया जाता है.
ध्यान दें: यहांdetails
फ़ील्ड में उपयोगकर्ता की दी गई वैल्यू होती है. यह ज़रूरी नहीं है कि यह GoogleStatus
फ़ॉर्मैट की तरह, प्रोटो टाइप के हिसाब से की गई वैल्यू की सूची हो.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"
}
}
}