คุณเรียกใช้ฟังก์ชันผ่านคำขอ HTTP ด้วยเครื่องมือจัดการคำขอได้ ซึ่งจะช่วยให้คุณเรียกใช้ฟังก์ชันผ่านเมธอด HTTP ที่รองรับต่อไปนี้ได้ GET, POST, PUT, DELETE และ OPTIONS
คู่มือนี้ถือว่าคุณได้ทำตามขั้นตอนการตั้งค่าที่อธิบายไว้ในคู่มือเริ่มต้นใช้งานสำหรับ Node.js และ Python หรือขั้นตอนการตั้งค่าสำหรับ Dart SDK เวอร์ชันทดลองแล้ว
ตัวเลือก HTTP เพิ่มเติม
| ตัวเลือก | คำอธิบาย |
|---|---|
region |
ฟังก์ชัน HTTP อาจระบุอาร์เรย์ของภูมิภาคและภูมิภาคเดียว เมื่อระบุหลายภูมิภาค ระบบจะติดตั้งใช้งานอินสแตนซ์ฟังก์ชันแยกกันสำหรับแต่ละภูมิภาค |
timeoutSeconds (timeout_sec สำหรับ Python) |
ฟังก์ชัน HTTP อาจระบุระยะหมดเวลาได้สูงสุด 1 ชั่วโมง |
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 อย่างชัดแจ้งได้โดยตั้งค่าตัวเลือก 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!'),
);
});
}
หากฟังก์ชันควรพร้อมใช้งานแบบเปิด เช่น หากให้บริการ API หรือเว็บไซต์สาธารณะ ให้ตั้งค่านโยบาย cors เป็น true
ทริกเกอร์ฟังก์ชันด้วยคำขอ HTTP
ใช้เครื่องจัดการคำขอสำหรับแพลตฟอร์มของคุณเพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ 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."""
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 ที่ไม่ซ้ำกันของฟังก์ชันได้ ใช้ 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
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() เสมอ ไม่เช่นนั้น ฟังก์ชันอาจยังคงทำงานต่อไปและระบบจะบังคับให้สิ้นสุดการทำงาน ดูข้อมูลเพิ่มเติมได้ที่การซิงค์, Async และ Promises
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
คุณสามารถเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting ได้ คำขอในเว็บไซต์ Firebase Hosting สามารถส่งผ่านพร็อกซีไปยังฟังก์ชัน HTTP ที่เฉพาะเจาะจงได้ นอกจากนี้ยังช่วยให้คุณใช้โดเมนที่กำหนดเองกับฟังก์ชัน HTTP ได้ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อ Cloud Functions กับ Firebase Hosting