เรียกใช้ฟังก์ชันผ่านคำขอ HTTP


คุณสามารถทริกเกอร์ฟังก์ชันผ่านคําขอ HTTP ด้วยตัวแฮนเดิลคําขอ ซึ่งช่วยให้คุณเรียกใช้ฟังก์ชันผ่านเมธอด HTTP ที่รองรับต่อไปนี้ได้ GET, POST, PUT, DELETE และ OPTIONS

ตัวเลือก HTTP เพิ่มเติม

ตัวเลือก คำอธิบาย
region ฟังก์ชัน HTTP อาจระบุอาร์เรย์ของภูมิภาคและภูมิภาคเดียว เมื่อระบุหลายภูมิภาค ระบบจะติดตั้งใช้งานอินสแตนซ์ฟังก์ชันแยกกันสำหรับแต่ละภูมิภาค
timeoutSeconds (timeout_sec สำหรับ Python) ฟังก์ชัน HTTP อาจระบุการหมดเวลาได้สูงสุด 1 ชั่วโมง
cors ฟังก์ชัน HTTP อาจระบุนโยบาย CORS คุณสามารถตั้งค่าเป็น true เพื่ออนุญาตต้นทางทั้งหมด หรือ string, regex หรือ array เพื่อระบุต้นทางที่อนุญาต ค่าเริ่มต้นคือเท็จ/ไม่มีนโยบาย CORS หากไม่ได้ตั้งค่าไว้อย่างชัดแจ้ง

การกำหนดค่า CORS (Cross-Origin Resource Sharing)

ใช้ตัวเลือก cors เพื่อควบคุมต้นทางที่เข้าถึงฟังก์ชันได้ โดยค่าเริ่มต้น ฟังก์ชัน HTTP จะไม่มีการกำหนดค่า CORS ซึ่งหมายความว่าคำขอข้ามแหล่งที่มาไปยังฟังก์ชันจะทำให้เกิดข้อผิดพลาดนี้

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

นอกจากนี้ คุณยังปิดใช้ CORS อย่างชัดเจนได้โดยการตั้งค่าตัวเลือก cors เป็น false สําหรับฟังก์ชัน

หากต้องการอนุญาตคําขอข้ามแหล่งที่มาบางรายการ แต่ไม่ใช่ทั้งหมด คุณสามารถส่งรายการโดเมนหรือนิพจน์ทั่วไปที่เจาะจงซึ่งควรอนุญาต ตัวอย่างเช่น หากคุณเป็นเจ้าของโดเมน firebase.com และ flutter.com และ firebase.com มีโดเมนย่อยได้หลายรายการ คุณอาจต้องตั้งค่าตัวเลือก cors เป็น [/firebase\.com$/, 'flutter.com'] สำหรับ Node.js หรือ [r'firebase\.com$', r'https://flutter\.com'] สำหรับ Python ดังนี้

Node.js

const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "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!")

หากต้องการให้ฟังก์ชันพร้อมใช้งานแบบเปิดเผย เช่น ให้บริการ API หรือเว็บไซต์สาธารณะ ให้ตั้งค่านโยบาย cors เป็น true

ทริกเกอร์ฟังก์ชันด้วยคําขอ HTTP

ใช้ตัวแฮนเดิลคําขอสําหรับแพลตฟอร์มของคุณ (onRequest() หรือ on_request) เพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ HTTP ตัวอย่างในส่วนนี้อิงตามตัวอย่าง "เซิร์ฟเวอร์เวลา" ที่ทริกเกอร์เมื่อคุณส่งคำขอ HTTP GET ไปยังปลายทางของฟังก์ชัน ฟังก์ชันตัวอย่างจะดึงข้อมูลเวลาปัจจุบันของเซิร์ฟเวอร์ จัดรูปแบบเวลาตามที่ระบุไว้ในพารามิเตอร์การค้นหาของ 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."""

การใช้แอป 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 ที่ไม่ซ้ำกันของฟังก์ชันนั้นได้ ใช้เอาต์พุต URL ที่ตรงกันทั้งหมดจาก CLI หลังจากการทำให้ใช้งานได้

ตัวอย่างเช่น URL ในการเรียกใช้ date() จะมีลักษณะดังนี้

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

สิ้นสุดฟังก์ชัน HTTP

หลังจากดึงข้อมูลและจัดรูปแบบเวลาของเซิร์ฟเวอร์แล้ว ฟังก์ชัน date() จะสิ้นสุดโดยส่งผลลัพธ์ในการตอบกลับ HTTP ดังนี้

Node.js

จบฟังก์ชัน HTTP ด้วย send(), redirect() หรือ end() เสมอ ไม่เช่นนั้น ฟังก์ชันอาจทํางานต่อไปและระบบจะบังคับให้หยุด ดูข้อมูลเพิ่มเติมได้ที่การซิงค์ การทำงานแบบไม่พร้อมกัน และ Promise

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)

การผสานรวมกับโฮสติ้งของ Firebase

คุณเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting ได้ คำขอในเว็บไซต์ Firebase Hosting ของคุณสามารถใช้พร็อกซีกับฟังก์ชัน HTTP ที่เฉพาะเจาะจงได้ ซึ่งยังช่วยให้คุณใช้โดเมนที่กำหนดเองกับฟังก์ชัน HTTP ได้ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อ Cloud Functions กับ Firebase Hosting