Gọi hàm qua yêu cầu HTTP


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: GET, POST, PUT, DELETEOPTIONS.

Ví dụ trên trang này dựa trên một hàm mẫu sẽ kích hoạt khi bạn gửi một 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ư 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 hàm bằng yêu cầu HTTP

Sử dụng functions.https để tạo hàm xử lý các sự kiện HTTP. Trình xử lý sự kiện cho hàm HTTP theo dõi sự kiện onRequest(). Sự kiện này hỗ trợ các bộ định tuyến và ứng dụng do khung web Express quản lý.

Sử dụng đối tượng phản hồi và yêu cầu Express

Được dùng làm đối số cho onRequest(), đối tượng Request (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, còn đối tượng Response (Phản hồi) sẽ cung cấp cho bạn cách gửi phản hồi lại cho ứng dụng.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Sử dụng ứ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 toàn bộ ứng dụng Express sang một hàm HTTP. Bạn có thể di chuyển mã Boilerplate sang phần mềm trung gian như sau:

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 này thông qua URL riêng biệt. URL 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 chức năng của mình. Một số hàm sản xuất có thể cần phải đặt vị trí một cách rõ ràng để giảm thiểu độ trễ mạng.
  • Mã dự án Firebase của bạn
  • cloudfunctions.net
  • Tên hàm của bạn

Ví dụ: URL để gọi date() sẽ 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 đang chạy lệnh triển khai.

Với tính năng định tuyến ứng dụng Express, tên hàm sẽ được thêm làm tiền tố vào đường dẫn URL trong ứng dụng mà bạn xác định. Ví dụ: URL để gọi phương thức getter trong ví dụ về ứng dụng Express ở trên sẽ có dạng như sau:

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

Nếu gọi các hàm HTTP sau bộ lọc IP hoặc tường lửa, 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 có Chức năng đám mây

Nếu bạn cần chèn các phần phụ thuộc của phần mềm trung gian cho những nội dung như hỗ trợ cookie hoặc CORS, hãy gọi những 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 "văn bản của tôi" request.body bằng "6d792074657874" (các byte thô của yêu cầu; hãy xem tài liệu về Vùng đệm Node.js)
text/plain "văn bản của tôi" request.body bằng "văn bản của tôi"
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 do các trình phân tích cú pháp nội dung sau đây thực hiện:

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 cụ thể hoá theo:

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 "cái gì đó"
req.rawBody Số byte thô (chưa được phân tích cú pháp) của yêu cầu

Trong ví dụ về hàm date(), hàm sẽ kiểm tra cả tham số URL và nội dung để tìm một giá trị format để đặt định dạng ngày/giờ sử dụng:

let format = req.query.format;
format = req.body.format;

Chấm dứt hàm HTTP

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 Đồng bộ hoá, Không đồng bộ và Hứa hẹn.

Sau khi truy xuất và định dạng thời gian máy chủ bằng mô-đun moment của Node.js, 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 dịch vụ lưu trữ Firebase

Bạn có thể kết nối hàm HTTP với Lưu trữ Firebase. Các yêu cầu trên trang web Lưu trữ Firebase có thể được xử lý qua các hàm HTTP cụ thể. Việc này cũng cho phép bạn sử dụng miền tuỳ chỉnh của riêng mình có hàm HTTP. Tìm hiểu thêm về cách kết nối Cloud Functions với tính năng Lưu trữ Firebase.