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 đây: GET, POST, PUT, DELETE và
OPTIONS.
Hướng dẫn này giả định rằng bạn đã hoàn tất các nhiệm vụ thiết lập được mô tả trong hướng dẫn bắt đầu sử dụng cho Node.js và Python, hoặc các nhiệm vụ thiết lập cho SDK Dart thử nghiệm.
Các lựa chọn khác về HTTP
| Phương thức | 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 phiên bản hàm riêng biệt sẽ được triển khai cho từng khu vực. |
timeoutSeconds (timeout_sec cho Python) |
Hàm HTTP có thể chỉ định thời gian chờ lên đến một giờ. |
cors |
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ả 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 những nguồn gốc 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 khác 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 khác 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 cụ thể hoặc biểu thức chính quy cần được cho phép. Ví dụ: nếu bạn sở hữu miền firebase.com và flutter.com, đồng thời firebase.com có thể có nhiều miền con, thì bạn nên đặt tuỳ chọn cors như sau:
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 (thử nghiệm)
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!'),
);
});
}
Nếu hàm của bạn cần được cung cấp công khai, chẳng hạn như 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 để 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" kích hoạt khi bạn gửi yêu cầu HTTP GET đến điểm cuối của hàm. Hàm mẫu truy xuất thời gian hiện tại của máy chủ, đị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 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.
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 (thử nghiệm)
void main() {
runFunctions((firebase) {
firebase.https.onRequest(name: 'date', (request) async {
Sử dụng các ứng dụng Express hoặc Flask hiện có
Khi 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 biệt của hàm. Sử dụng chính xác URL mà CLI xuất ra 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 làm tiền tố cho các đườ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à nội dung để tìm giá trị format nhằm đặ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
Dart (thử nghiệm)
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');
}
Chấm dứt hàm HTTP
Sau khi truy xuất và định dạng thời gian của 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 bài viết
Đồ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)
Dart (thử nghiệm)
final formattedDate = DateFormat(format).format(DateTime.now());
print('Sending formatted date: $formattedDate');
return Response.ok(formattedDate);
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. Bạn có thể chuyển yêu cầu trên trang web Firebase Hosting của mình đế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 với một hàm HTTP. Tìm hiểu thêm về việc kết nối Cloud Functions với Firebase Hosting.