अनुरोध हैंडलर के साथ एचटीटीपी अनुरोध भेजकर, किसी फ़ंक्शन को ट्रिगर किया जा सकता है. इससे आपको एचटीटीपी के इन तरीकों का इस्तेमाल करके, किसी फ़ंक्शन को शुरू करने की सुविधा मिलती है: GET, POST, PUT, DELETE, और OPTIONS.
इस गाइड में यह माना गया है कि आपने Node.js और Python के लिए शुरुआती निर्देश या एक्सपेरिमेंट के तौर पर उपलब्ध Dart SDK टूल में बताए गए सेटअप टास्क पूरे कर लिए हैं.
एचटीटीपी के अन्य विकल्प
| विकल्प | ब्यौरा |
|---|---|
region |
एचटीटीपी फ़ंक्शन, एक क्षेत्र के साथ-साथ कई क्षेत्रों के कलेक्शन के बारे में भी बता सकते हैं. एक से ज़्यादा क्षेत्र तय करने पर, हर क्षेत्र के लिए फ़ंक्शन का एक अलग इंस्टेंस डिप्लॉय किया जाएगा. |
timeoutSeconds (Python के लिए timeout_sec) |
एचटीटीपी फ़ंक्शन के लिए, ज़्यादा से ज़्यादा एक घंटे का टाइम आउट तय किया जा सकता है. |
cors |
एचटीटीपी फ़ंक्शन, सीओआरएस नीतियों के बारे में बता सकते हैं. इसे true पर सेट करके, सभी ऑरिजिन को अनुमति दी जा सकती है. इसके अलावा, string, regex या array पर सेट करके, अनुमति वाले ऑरिजिन तय किए जा सकते हैं. अगर साफ़ तौर पर सेट नहीं किया गया है, तो डिफ़ॉल्ट रूप से यह 'गलत है' पर सेट होता है या कोई सीओआरएस नीति लागू नहीं होती. |
सीओआरएस (क्रॉस-ऑरिजिन रिसॉर्स शेयरिंग) को कॉन्फ़िगर करना
cors विकल्प का इस्तेमाल करके, यह कंट्रोल करें कि कौनसे ऑरिजिन आपके फ़ंक्शन को ऐक्सेस कर सकते हैं. डिफ़ॉल्ट रूप से, एचटीटीपी फ़ंक्शन में सीओआरएस कॉन्फ़िगर नहीं होता है. इसका मतलब है कि आपके फ़ंक्शन के लिए किए गए किसी भी क्रॉस-ऑरिजिन अनुरोध की वजह से, यह गड़बड़ी होती है:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
अपने फ़ंक्शन के लिए, cors विकल्प को false पर सेट करके भी सीओआरएस को बंद किया जा सकता है.
कुछ क्रॉस-ऑरिजिन अनुरोधों को अनुमति देने के लिए, उन डोमेन या रेगुलर एक्सप्रेशन की सूची पास की जा सकती है जिन्हें अनुमति दी जानी चाहिए. उदाहरण के लिए, अगर आपके पास firebase.com और flutter.com डोमेन हैं और firebase.com के कई सबडोमेन हो सकते हैं, तो हो सकता है कि आप cors विकल्प को इस तरह सेट करना चाहें:
Node.js
const { onRequest } = require("firebase-functions/v2/https");
exports.sayHello = onRequest(
{ cors: [/firebase\.com$/, "https://flutter.com"] },
(req, res) => {
res.status(200).send("Hello world!");
}
);
Python
from firebase_functions import https_fn, options
@https_fn.on_request(
cors=options.CorsOptions(
cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
cors_methods=["get", "post"],
)
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello world!")
Dart (एक्सपेरिमेंट के तौर पर उपलब्ध)
import 'package:firebase_functions/firebase_functions.dart';
void main() {
runFunctions((firebase) {
firebase.https.onRequest(
name: 'sayHello',
options: const HttpsOptions(
cors: Cors([RegExp(r'^https:\/\/firebase\.com$'), 'https://flutter.com']),
),
(request) async => Response(200, body: 'Hello world!'),
);
});
}
अगर आपको अपने फ़ंक्शन को सभी के लिए उपलब्ध कराना है, तो cors नीति को true पर सेट करें. उदाहरण के लिए, अगर वह फ़ंक्शन किसी सार्वजनिक एपीआई या वेबसाइट के लिए काम कर रहा है.
एचटीटीपी अनुरोध की मदद से किसी फ़ंक्शन को ट्रिगर करना
अपने प्लैटफ़ॉर्म के लिए अनुरोध हैंडलर का इस्तेमाल करके, एचटीटीपी इवेंट को हैंडल करने वाला फ़ंक्शन बनाएं. इस सेक्शन में दिए गए उदाहरण, "टाइम सर्वर" के सैंपल पर आधारित हैं. यह सैंपल तब ट्रिगर होता है, जब फ़ंक्शन एंडपॉइंट पर एचटीटीपी GET अनुरोध भेजा जाता है. सैंपल फ़ंक्शन, सर्वर का मौजूदा समय हासिल करता है. साथ ही, यूआरएल क्वेरी पैरामीटर में बताए गए फ़ॉर्मैट के हिसाब से समय को फ़ॉर्मैट करता है और एचटीटीपी रिस्पॉन्स में नतीजा भेजता है.
अनुरोध और जवाब वाले ऑब्जेक्ट इस्तेमाल करना
अनुरोध ऑब्जेक्ट से आपको क्लाइंट के भेजे गए एचटीटीपी अनुरोध की प्रॉपर्टी का ऐक्सेस मिलता है. साथ ही, रिस्पॉन्स ऑब्जेक्ट से आपको क्लाइंट को जवाब भेजने का तरीका मिलता है.
Node.js
exports.date = onRequest( {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]}, (req, res) => { // ... });
Python
@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
"""Get the server's local date and time."""
Dart (एक्सपेरिमेंट के तौर पर उपलब्ध)
void main() {
runFunctions((firebase) {
firebase.https.onRequest(name: 'date', (request) async {
मौजूदा Express या Flask ऐप्लिकेशन का इस्तेमाल करना
ऐप्लिकेशन को अनुरोध हैंडलर के आर्ग्युमेंट के तौर पर इस्तेमाल करके, पूरे ऐप्लिकेशन को एचटीटीपी फ़ंक्शन में पास किया जा सकता है:
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const express = require('express');
const app = express();
// Add middleware to authenticate requests
app.use(myMiddleware);
// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));
// Expose Express API as a single Cloud Function:
exports.widgets = onRequest(app);
Python
from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask
initialize_app()
app = flask.Flask(__name__)
# Build multiple CRUD interfaces:
@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
if id is not None:
return db.reference(f"/widgets/{id}").get()
else:
return db.reference("/widgets").get()
@app.post("/widgets")
def add_widget():
new_widget = flask.request.get_data(as_text=True)
db.reference("/widgets").push(new_widget)
return flask.Response(status=201, response="Added widget")
# Expose Flask app as a single Cloud Function:
@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
with app.request_context(req.environ):
return app.full_dispatch_request()
एचटीटीपी फ़ंक्शन को शुरू करना
एचटीटीपी फ़ंक्शन को डिप्लॉय करने के बाद, उसे उसके यूनीक यूआरएल से शुरू किया जा सकता है. डिप्लॉयमेंट के बाद, सीएलआई से मिले सटीक यूआरएल का इस्तेमाल करें.
उदाहरण के लिए, date() को शुरू करने का यूआरएल कुछ ऐसा दिखता है:
https://us-central1-<project-id>.cloudfunctions.net/date
Express और Flask ऐप्लिकेशन रूटिंग की मदद से, फ़ंक्शन के नाम को आपके तय किए गए ऐप्लिकेशन में यूआरएल पाथ के प्रीफ़िक्स के तौर पर जोड़ा जाता है.
अनुरोध से वैल्यू पढ़ना
date() फ़ंक्शन के उदाहरण में, फ़ंक्शन यूआरएल पैरामीटर और बॉडी, दोनों की जांच करता है. ऐसा तारीख/समय के फ़ॉर्मैट को सेट करने के लिए, format वैल्यू के लिए किया जाता है:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
Dart (एक्सपेरिमेंट के तौर पर उपलब्ध)
var format = request.url.queryParameters['format'];
final bodyString = await request.readAsString();
try {
if (bodyString.isNotEmpty) {
final body = jsonDecode(bodyString) as Map<String, dynamic>;
format = body['format'] as String?;
}
} catch (e) {
return Response.badRequest(body: 'invalid JSON');
}
एचटीटीपी फ़ंक्शन को बंद करना
सर्वर का समय पाने और उसे फ़ॉर्मैट करने के बाद, date() फ़ंक्शन, एचटीटीपी रिस्पॉन्स में नतीजा भेजकर खत्म होता है:
Node.js
एचटीटीपी फ़ंक्शन को हमेशा send(), redirect() या end() के साथ खत्म करें. ऐसा न करने पर, हो सकता है कि आपका फ़ंक्शन चलता रहे और सिस्टम उसे ज़बरदस्ती बंद कर दे. सिंक, एसिंक, और प्रॉमिस भी देखें.
const formattedDate = moment().format(`${format}`); logger.log("Sending formatted date:", formattedDate); res.status(200).send(formattedDate);
Python
formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)
Dart (एक्सपेरिमेंट के तौर पर उपलब्ध)
final formattedDate = DateFormat(format).format(DateTime.now());
print('Sending formatted date: $formattedDate');
return Response.ok(formattedDate);
Firebase होस्टिंग के साथ इंटिग्रेट करना
Firebase Hosting से एचटीटीपी फ़ंक्शन को कनेक्ट किया जा सकता है. आपकी Firebase Hosting साइट पर किए गए अनुरोधों को, एचटीटीपी फ़ंक्शन के लिए प्रॉक्सी किया जा सकता है. इससे आपको एचटीटीपी फ़ंक्शन के साथ अपने कस्टम डोमेन का इस्तेमाल करने की सुविधा भी मिलती है. Cloud Functions को Firebase Hosting से कनेक्ट करने के बारे में ज़्यादा जानें.