HTTP অনুরোধের মাধ্যমে ফাংশন কল করা

আপনি অনুরোধ হ্যান্ডলারের মাধ্যমে HTTP অনুরোধের মাধ্যমে কোনও ফাংশন ট্রিগার করতে পারেন। এটি আপনাকে নিম্নলিখিত কাজ করে এমন HTTP পদ্ধতির মাধ্যমে ফাংশন ইনভোক করতে দেয়: GET, POST, PUT, DELETE এবং OPTIONS।

এই নির্দেশিকায় ধরে নেওয়া হয়েছে যে আপনি আমাদের Node.js ও Python-এর জন্য শুরু করার নির্দেশিকা অথবা পরীক্ষামূলক Dart SDK-এর জন্য সেট-আপ টাস্ক সম্পূর্ণ করেছেন।

অতিরিক্ত HTTP বিকল্প

বিকল্প বিবরণ
region HTTP ফাংশন একটি অঞ্চলের পাশাপাশি একাধিক অঞ্চলের অ্যারেও নির্দিষ্ট করতে পারে। একাধিক অঞ্চল উল্লেখ করা হলে, প্রতিটি অঞ্চলের জন্য আলাদা ফাংশন ইনস্ট্যান্স ডেপ্লয় করা হবে।
timeoutSeconds (Python-এর জন্য timeout_sec) HTTP ফাংশন সর্বাধিক এক ঘণ্টার টাইম-আউট নির্দিষ্ট করতে পারে।
cors HTTP ফাংশন CORS নীতি নির্দিষ্ট করতে পারে। আপনি এটি true-এ সেট করে সবকটি অরিজিনকে অনুমতি দিতে পারেন অথবা string, regex বা array-এ সেট করে অনুমোদিত অরিজিন নির্দিষ্ট করতে পারেন। স্পষ্টভাবে সেট করা না থাকলে, ডিফল্ট হিসেবে false/কোনও CORS নীতি থাকে না।

CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) কনফিগার করা

কোন কোন অরিজিন আপনার ফাংশন অ্যাক্সেস করতে পারবে তা কন্ট্রোল করতে cors বিকল্প ব্যবহার করুন। সাধারণত, HTTP ফাংশনে CORS কনফিগার করা থাকে না, অর্থাৎ, আপনার ফাংশনে কোনও ক্রস-অরিজিন অনুরোধ করলে এই সমস্যাটি হয়:

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

এছাড়াও, আপনার ফাংশনের জন্য cors বিকল্পকে false হিসেবে সেট করে আপনি CORS স্পষ্টভাবে বন্ধ করতে পারবেন।

কিছু ক্রস-অরিজিন অনুরোধকে অনুমতি দিতে, কিন্তু সবগুলিকে নয়, আপনাকে নির্দিষ্ট ডোমেন বা রেগুলার এক্সপ্রেশনের একটি তালিকা পাস করতে হবে যেগুলিকে অনুমতি দেওয়া উচিত। যেমন, যদি আপনি 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!'),
    );
  });
}

আপনার ফাংশন যদি সকলের জন্য উপলভ্য হতে হয়, যেমন, এটি যদি কোনও পাবলিক API বা ওয়েবসাইট পরিবেশন করে, তাহলে cors নীতিকে true হিসেবে সেট করুন।

HTTP অনুরোধের মাধ্যমে ফাংশন ট্রিগার করা

HTTP ইভেন্ট ম্যানেজ করে এমন ফাংশন তৈরি করতে, আপনার প্ল্যাটফর্মের জন্য অনুরোধ হ্যান্ডলার ব্যবহার করুন। এই বিভাগে দেওয়া উদাহরণগুলি "টাইম সার্ভার" স্যাম্পেলের উপর ভিত্তি করে তৈরি করা হয়েছে যা ফাংশন এন্ডপয়েন্টে HTTP GET অনুরোধ পাঠালে ট্রিগার হয়। sample ফাংশন বর্তমান সার্ভার টাইম রিট্রিভ করে, URL কোয়েরি প্যারামিটারে নির্দিষ্ট করা অনুযায়ী টাইম ফর্ম্যাট করে এবং HTTP রেসপন্সে ফলাফল পাঠায়।

অনুরোধ ও উত্তর অবজেক্ট ব্যবহার করা

অনুরোধ অবজেক্ট আপনাকে ক্লায়েন্টের পাঠানো HTTP অনুরোধের প্রপার্টি অ্যাক্সেস করতে দেয় এবং উত্তর অবজেক্ট আপনাকে ক্লায়েন্টকে উত্তর পাঠানোর একটি উপায় দেয়।

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 অ্যাপ ব্যবহার করা

অনুরোধ হ্যান্ডলারের আর্গুমেন্ট হিসেবে অ্যাপ ব্যবহার করে, আপনি HTTP ফাংশনে সম্পূর্ণ অ্যাপ পাস করতে পারবেন:

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()

HTTP ফাংশন ইনভোক করা

আপনি কোনও HTTP ফাংশন ডিপ্লয় করার পরে, এর নিজস্ব অনন্য URL-এর মাধ্যমে এটি ইনভোক করতে পারবেন। ডিপ্লয়মেন্টের পরে CLI থেকে পাওয়া সঠিক URL আউটপুট ব্যবহার করুন।

যেমন, date()-কে ইনভোক করার URLটি দেখতে এইরকম হয়:

https://us-central1-<project-id>.cloudfunctions.net/date

Express এবং Flask অ্যাপ রাউটিংয়ের মাধ্যমে, আপনার সংজ্ঞায়িত অ্যাপের URL পাথে ফাংশনের নাম প্রিফিক্স হিসেবে যোগ করা হয়।

অনুরোধ থেকে ভ্যালু পড়া

date() ফাংশনের উদাহরণে, ফাংশনটি URL প্যারামিটার এবং বডি, দু'টিকেই 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');
}

HTTP ফাংশন বন্ধ করা

সার্ভার টাইম রিট্রিভ ও ফর্ম্যাট করার পরে, date() ফাংশন HTTP রেসপন্সে ফলাফল পাঠিয়ে শেষ হয়:

Node.js

সবসময় HTTP ফাংশন 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 Hosting-এর সাথে ইন্টিগ্রেট করা

আপনি Firebase Hosting-এর সাথে একটি HTTP ফাংশন কানেক্ট করতে পারবেন। আপনার Firebase Hosting সাইটে করা অনুরোধ নির্দিষ্ট HTTP ফাংশনে প্রক্সি করা যেতে পারে। এছাড়াও, এটি আপনাকে HTTP ফাংশনের সাথে আপনার নিজস্ব কাস্টম ডোমেন ব্যবহার করতে দেয়। Cloud Functions-কে Firebase Hosting-এর সাথে কানেক্ট করা সম্পর্কে আরও জানুন।