Bạn có thể kích hoạt một hàm thông qua yêu cầu HTTP bằng cách sử dụng functions.https. Điều này cho phép bạn gọi một hàm đồng bộ thông qua các phương thức HTTP được hỗ trợ sau đây: GET, POST, PUT, DELETE và OPTIONS.
Các ví dụ trong trang này dựa trên một
hàm mẫu
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 này truy xuất thời gian hiện tại của máy chủ, định dạng thời gian theo chỉ định trong tham số truy vấn URL và gửi kết quả trong phản hồi HTTP.
Kích hoạt một hàm bằng yêu cầu HTTP
Sử dụng functions.https
để tạo một hàm xử lý các sự kiện HTTP. Trình xử lý sự kiện cho một hàm HTTP sẽ theo dõi sự kiện
onRequest(),
hỗ trợ các bộ định tuyến và ứng dụng do
khung web Express quản lý.
Sử dụng các đối tượng yêu cầu và phản hồi Express
Được dùng làm đối số cho onRequest(),
đố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 cung cấp cho bạn cách
gửi phản hồi trở lại ứng dụng.
exports.date = functions.https.onRequest((req, res) => { // ... });
Sử dụng các ứng dụng Express hiện có
Khi sử dụng Ứng dụng làm đối số cho
onRequest(), bạn có thể
truyền một ứng dụng Express đầy đủ đến một hàm HTTP. Mã nguyên mẫu có thể được chuyển sang phần mềm trung gian như minh hoạ:
const express = require('express');
const cors = require('cors');
const app = express();
// Automatically allow cross-origin requests
app.use(cors({ origin: true }));
// 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 = functions.https.onRequest(app);
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 duy nhất của riêng hàm. URL này bao gồm các thành phần sau theo thứ tự:
- Khu vực (hoặc các khu vực) mà bạn đã triển khai hàm. Một số hàm sản xuất có thể cần đặt vị trí một cách rõ ràng để giảm thiểu độ trễ mạng.
- Mã dự án Firebase
cloudfunctions.net- Tên hàm
Ví dụ: URL để gọi date() có dạng như sau:
https://us-central1-<project-id>.cloudfunctions.net/date
Nếu bạn gặp lỗi về quyền khi triển khai hàm, hãy đảm bảo rằng các vai trò IAM thích hợp được chỉ định cho người dùng chạy các lệnh triển khai.
Với tính năng định tuyến ứng dụng Express, tên hàm được thêm làm tiền tố vào các đường dẫn URL trong ứng dụng mà bạn xác định. Ví dụ: URL để gọi getter trong ví dụ về ứng dụng Express ở trên có dạng như sau:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Nếu gọi các hàm HTTP đằng sau tường lửa hoặc bộ lọc IP, bạn có thể tra cứu các địa chỉ IP mà Google sử dụng để phân phát các hàm HTTP.
Sử dụng các mô-đun phần mềm trung gian với Cloud Functions
Nếu bạn cần chèn các phần phụ thuộc phần mềm trung gian cho những nội dung như hỗ trợ cookie hoặc CORS, hãy gọi các phần phụ thuộc này trong hàm. Ví dụ: để bật tính năng hỗ trợ CORS, hãy thêm khối sau:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Đọc các giá trị từ yêu cầu
Bảng sau đây liệt kê một số trường hợp phổ biến:| Loại nội dung | Nội dung yêu cầu | Hành vi |
|---|---|---|
application/json |
'{"name":"John"}' |
request.body.name bằng "John" |
application/octet-stream |
"my text" | request.body bằng '6d792074657874' (các byte thô của yêu cầu; xem tài liệu về Node.js Buffer) |
text/plain |
"my text" | request.body bằng "my text" |
application/x-www-form-urlencoded |
"name=John" | request.body.name bằng "John" |
Quá trình phân tích cú pháp này được thực hiện bởi các trình phân tích cú pháp nội dung sau:
- Trình phân tích cú pháp nội dung JSON
- Trình phân tích cú pháp nội dung thô
- Trình phân tích cú pháp nội dung văn bản
- Trình phân tích cú pháp nội dung biểu mẫu được mã hoá bằng URL
Giả sử hàm của bạn được gọi bằng yêu cầu sau:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
thì dữ liệu đã gửi sẽ được hiện thực hoá trong:
| Thuộc tính/Phương thức | Giá trị |
|---|---|
req.method |
"POST" |
req.get('x-myheader') |
"123" |
req.query.foo |
"baz" |
req.body.text |
"something" |
req.rawBody |
Các byte thô (chưa phân tích cú pháp) của yêu cầu |
Trong ví dụ về hàm date(), hàm này sẽ kiểm thử cả tham số URL và nội dung cho giá trị format để đặt định dạng ngày/giờ cần sử dụng:
let format = req.query.format; format = req.body.format;
Kết thúc hàm HTTP
Luôn kết thúc một 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 kết thúc. Xem thêm bài viết
Đồng bộ hoá, Không đồng bộ và Lời hứa.
Sau khi truy xuất và định dạng thời gian của máy chủ bằng mô-đun Node.js
moment, hàm date() sẽ kết thúc bằng cách gửi kết quả trong phản hồi HTTP:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
Kết nối hàm HTTP 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 đế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ề cách kết nối Cloud Functions với Firebase Hosting.