Bạn có thể kích hoạt một hàm thông qua yêu cầu HTTP bằng trình xử lý yêu cầu. Điều này cho phép bạn gọi một hàm thông qua các phương thức HTTP được hỗ trợ sau: GET
, POST
, PUT
, DELETE
và OPTIONS
.
Các tuỳ chọn HTTP khác
Phương thức | Nội dung mô tả |
---|---|
region |
Hàm HTTP có thể chỉ định một mảng các khu vực cũng như một khu vực duy nhất. Khi bạn chỉ định nhiều khu vực, một thực thể hàm riêng biệt sẽ được triển khai cho mỗi khu vực. |
timeoutSeconds (timeout_sec cho Python) |
Các hàm HTTP có thể chỉ định thời gian chờ tối đa là một giờ. |
cors |
Các hàm HTTP có thể chỉ định chính sách CORS. Bạn có thể đặt giá trị này thành true để cho phép tất cả các nguồn gốc hoặc string , regex hoặc array để chỉ định các nguồn gốc được phép. Mặc định là false/không có chính sách CORS nếu không được đặt rõ ràng. |
Định cấu hình CORS (Chia sẻ tài nguyên trên nhiều nguồn gốc)
Sử dụng tuỳ chọn cors
để kiểm soát nguồn gốc nào có thể truy cập vào hàm của bạn. Theo mặc định, các hàm HTTP không được định cấu hình CORS, nghĩa là mọi yêu cầu trên nhiều nguồn gốc đến hàm của bạn đều dẫn đến lỗi này:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Bạn cũng có thể tắt CORS một cách rõ ràng bằng cách đặt tuỳ chọn cors
thành false
cho hàm của mình.
Để cho phép một số yêu cầu trên nhiều nguồn gốc nhưng không phải tất cả, bạn có thể truyền danh sách các miền hoặc biểu thức chính quy cụ thể được phép. Ví dụ: nếu bạn sở hữu các miền firebase.com
và flutter.com
và firebase.com
có thể có nhiều miền con, bạn nên đặt tuỳ chọn cors
thành [/firebase\.com$/, 'flutter.com']
cho Node.js hoặc [r'firebase\.com$', r'https://flutter\.com']
cho 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!")
Nếu bạn muốn cung cấp công khai hàm của mình, ví dụ: nếu hàm đó đang phân phát một API hoặc trang web công khai, hãy đặt chính sách cors
thành true
.
Kích hoạt một hàm bằng yêu cầu HTTP
Sử dụng trình xử lý yêu cầu cho nền tảng của bạn (onRequest()
hoặc on_request
) để tạo một hàm xử lý các sự kiện HTTP. Các ví dụ trong phần này dựa trên mẫu "máy chủ thời gian" sẽ kích hoạt khi bạn gửi yêu cầu GET
HTTP đến điểm cuối của hàm. Hàm mẫu truy xuất thời gian máy chủ hiện tại, định dạng thời gian như được chỉ định trong tham số truy vấn URL và gửi kết quả trong phản hồi HTTP.
Sử dụng đối tượng yêu cầu và phản hồi
Đối tượng yêu cầu cho phép bạn truy cập vào các thuộc tính của yêu cầu HTTP do ứng dụng khách gửi và đối tượng phản hồi cho phép bạn gửi phản hồi lại cho ứng dụng khách.
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."""
Sử dụng các ứng dụng Express hoặc Flask hiện có
Bằng cách sử dụng ứng dụng làm đối số cho trình xử lý yêu cầu, bạn có thể truyền toàn bộ ứng dụng đến một hàm 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()
Gọi một hàm HTTP
Sau khi triển khai một hàm HTTP, bạn có thể gọi hàm đó thông qua URL riêng. Sử dụng kết quả URL chính xác từ CLI sau khi triển khai.
Ví dụ: URL để gọi date()
có dạng như sau:
https://us-central1-<project-id>.cloudfunctions.net/date
Với tính năng định tuyến ứng dụng Express và Flask, tên hàm được thêm vào làm tiền tố cho đường dẫn URL trong ứng dụng mà bạn xác định.
Đọc giá trị từ yêu cầu
Trong ví dụ về hàm date()
, hàm này kiểm tra cả tham số URL và phần nội dung cho giá trị format
để đặt định dạng ngày/giờ cần sử dụng:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
Chấm dứt các hàm HTTP
Sau khi truy xuất và định dạng thời gian máy chủ, hàm date()
sẽ kết thúc bằng cách gửi kết quả trong phản hồi HTTP:
Node.js
Luôn kết thúc hàm HTTP bằng send()
, redirect()
hoặc end()
. Nếu không, hàm của bạn có thể tiếp tục chạy và bị hệ thống buộc chấm dứt. Xem thêm phần Đồng bộ, không đồng bộ và Lời hứa.
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)
Tích hợp với Firebase Hosting
Bạn có thể kết nối một hàm HTTP với Firebase Hosting. Các yêu cầu trên trang web Firebase Hosting có thể được chuyển tiếp đến các hàm HTTP cụ thể. Điều này cũng cho phép bạn sử dụng miền tuỳ chỉnh của riêng mình bằng một hàm HTTP. Tìm hiểu thêm về cách kết nối Cloud Functions với Firebase Hosting.