Gọi các 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. Thao tác này cho phép bạn gọi hàm đồng bộ thông qua các phương thức HTTP được hỗ trợ sau đây: GET, POST, PUT, DELETEOPTIONS.

Các ví dụ trong trang này được dựa trên hàm mẫu 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 máy chủ hiện tại, định dạng thời gian như được chỉ định trong truy vấn URL rồi gửi kết quả trong phản hồi HTTP.

Kích hoạt hàm có yêu cầu HTTP

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

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

Được dùng làm đối số cho onRequest(), đối tượng Request sẽ cung cấp bạn truy cập vào thuộc tính của yêu cầu HTTP do máy khách gửi và Đối tượng Phản hồi cung cấp cho bạn cách gửi lại phản hồi cho khách hàng.

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

Sử dụng các ứng dụng Express hiện có

Dùng App (Ứng dụng) làm đối số cho onRequest(), bạn có thể truyền ứng dụng Express đầy đủ đến hàm HTTP. Có thể di chuyển mã tạo sẵn vào 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 hàm HTTP, bạn có thể gọi hàm đó thông qua hàm duy nhất URL. URL bao gồm theo thứ tự sau:

  • Khu vực (hoặc vùng) mà bạn đã triển khai hàm. Một số nội dung phát hành công khai có thể cần đặt location 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() có dạng như sau:

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

Nếu bạn gặp phải lỗi về quyền khi triển khai các chức năng, hãy đảm bảo rằng các vai trò quản lý danh tính và quyền truy cập (IAM) thích hợp là gán cho người dùng chạy 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ố cho đường dẫn URL trong ứng dụng bạn xác định. Ví dụ: URL để gọi phương thức getter trong Express ví dụ về ứng dụng ở trên sẽ có dạng như sau:

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

Nếu bạn gọi các hàm HTTP sau tường lửa hoặc bộ lọc IP, bạn có thể tra cứu địa chỉ IP mà Google sử dụng để cung cấp các chức năng 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 việc như hỗ trợ cookie hoặc CORS, hãy gọi các đối tượng 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; 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 "một điều gì đó"
req.rawBody 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 này sẽ kiểm tra cả tham số URL và phần nội dung cho giá trị format để đặt định dạng ngày/giờ sẽ 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 Node.js Mô-đun moment, hàm date() 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 các hàm HTTP với dịch vụ Lưu trữ Firebase

Bạn có thể kết nối một hàm HTTP với tính năng Lưu trữ Firebase. Yêu cầu trên Trang web Lưu trữ Firebase có thể được xử lý qua proxy cho 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 thông qua hàm HTTP. Tìm hiểu thêm về kết nối Cloud Functions với dịch vụ Lưu trữ Firebase.