Catch up on highlights from Firebase at Google I/O 2023. Learn more

ฟังก์ชันการโทรผ่านคำขอ HTTP


คุณสามารถทริกเกอร์ฟังก์ชันผ่านคำขอ HTTP โดยใช้ functions.https สิ่งนี้ทำให้คุณสามารถเรียกใช้ฟังก์ชันซิงโครนัสผ่านเมธอด HTTP ที่รองรับต่อไปนี้: GET , POST , PUT , DELETE และ OPTIONS

ตัวอย่างในหน้านี้อ้างอิงจาก ฟังก์ชันตัวอย่าง ที่ทริกเกอร์เมื่อคุณส่งคำขอ HTTP GET ไปยังปลายทางของฟังก์ชัน ฟังก์ชันตัวอย่างดึงข้อมูลเวลาเซิร์ฟเวอร์ปัจจุบัน จัดรูปแบบเวลาตามที่ระบุในพารามิเตอร์การสืบค้น URL และส่งผลลัพธ์ในการตอบกลับ HTTP

ทริกเกอร์ฟังก์ชันด้วยคำขอ HTTP

ใช้ functions.https เพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ HTTP ตัวจัดการเหตุการณ์สำหรับฟังก์ชัน HTTP จะรับฟังเหตุการณ์ onRequest() ซึ่งสนับสนุนเราเตอร์และแอปที่จัดการโดย Express web framework

การใช้อ็อบเจกต์การร้องขอและการตอบสนองแบบด่วน

ใช้เป็นอาร์กิวเมนต์สำหรับ onRequest() อ็อบเจ็กต์ Request ให้คุณเข้าถึงคุณสมบัติของคำขอ HTTP ที่ไคลเอ็นต์ส่ง และอ็อบเจ็กต์ Response ให้คุณมีวิธีส่งการตอบกลับกลับไปยังไคลเอ็นต์

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

ใช้แอพ Express ที่มีอยู่

สิ่งที่ต้องทำ: ฉันควรทำเงื่อนไขนี้จาก Python หรือไม่

การใช้ App เป็นอาร์กิวเมนต์สำหรับ onRequest() คุณสามารถส่งแอป Express แบบเต็มไปยังฟังก์ชัน HTTP สามารถย้ายรหัส Boilerplate ไปยังมิดเดิลแวร์ได้ดังที่แสดง:

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);

เรียกใช้ฟังก์ชัน HTTP

หลังจากที่คุณปรับใช้ฟังก์ชัน HTTP แล้ว คุณสามารถเรียกใช้ผ่าน URL เฉพาะของมันเอง URL มีดังต่อไปนี้ ตามลำดับ:

  • ภูมิภาค (หรือภูมิภาค) ที่คุณปรับใช้ฟังก์ชันของคุณ ฟังก์ชันการผลิตบางอย่างอาจต้องตั้งค่า ตำแหน่ง อย่างชัดเจนเพื่อลดเวลาแฝงของเครือข่าย
  • รหัสโครงการ Firebase ของคุณ
  • cloudfunctions.net
  • ชื่อฟังก์ชันของคุณ

ตัวอย่างเช่น URL ที่จะเรียกใช้ date() จะมีลักษณะดังนี้:

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

หากคุณพบข้อผิดพลาดเกี่ยวกับสิทธิ์เมื่อปรับใช้ฟังก์ชัน ตรวจสอบให้แน่ใจว่าได้กำหนด บทบาท IAM ที่เหมาะสมให้กับผู้ใช้ที่รันคำสั่งการปรับใช้

ด้วยการกำหนดเส้นทางแอป Express ชื่อฟังก์ชันจะถูกเพิ่มเป็นคำนำหน้าของเส้นทาง URL ในแอปที่คุณกำหนด ตัวอย่างเช่น URL ที่จะเรียกใช้ getter ในตัวอย่างแอป Express ด้านบนจะมีลักษณะดังนี้:

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

หากคุณเรียกใช้ฟังก์ชัน HTTP หลังไฟร์วอลล์หรือตัวกรอง IP คุณสามารถ ค้นหา ที่อยู่ IP ที่ Google ใช้เพื่อให้บริการฟังก์ชัน HTTP

ใช้โมดูลมิดเดิลแวร์กับ Cloud Functions

หากคุณต้องการเพิ่มการพึ่งพามิดเดิลแวร์สำหรับสิ่งต่างๆ เช่น การสนับสนุนคุกกี้หรือ CORS ให้เรียกใช้สิ่งเหล่านี้ภายในฟังก์ชัน ตัวอย่างเช่น หากต้องการเปิดใช้งานการสนับสนุน CORS ให้เพิ่มบล็อกต่อไปนี้:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

อ่านค่าจากคำขอ

ตารางต่อไปนี้แสดงสถานการณ์ทั่วไปบางประการ:

ชนิดของเนื้อหา ขอเนื้อความ พฤติกรรม
application/json '{"name":"John"}' request.body.name เท่ากับ 'จอห์น'
application/octet-stream 'ข้อความของฉัน' request.body เท่ากับ '6d792074657874' (ไบต์ดิบของคำขอ ดู เอกสาร Node.js Buffer )
text/plain 'ข้อความของฉัน' request.body เท่ากับ 'ข้อความของฉัน'
application/x-www-form-urlencoded 'ชื่อ=จอห์น' request.body.name เท่ากับ 'จอห์น'

การแยกวิเคราะห์นี้ทำโดยตัวแยกวิเคราะห์เนื้อหาต่อไปนี้:

สมมติว่าฟังก์ชันของคุณถูกเรียกใช้ด้วยคำขอต่อไปนี้:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

จากนั้นข้อมูลที่ส่งจะเกิดขึ้นภายใต้:

คุณสมบัติ/วิธีการ ค่า
req.method "โพสต์"
req.get('x-myheader') "123"
req.query.foo "บาส"
req.body.text "บางสิ่งบางอย่าง"
req.rawBody ไบต์ดิบ (ไม่ได้แยกวิเคราะห์) ของคำขอ

ในตัวอย่างฟังก์ชัน date() ฟังก์ชันจะทดสอบทั้งพารามิเตอร์ URL และเนื้อหาเพื่อหาค่า format เพื่อตั้งค่ารูปแบบวันที่/เวลาที่จะใช้:

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

ยุติฟังก์ชัน HTTP

สิ้นสุดฟังก์ชัน HTTP ด้วย send() , redirect() หรือ end() เสมอ มิฉะนั้น ฟังก์ชันของคุณอาจทำงานต่อไปและถูกบังคับให้ยุติโดยระบบ ดูเพิ่มเติมที่ Sync, Async และ Promises

หลังจากดึงข้อมูลและจัดรูปแบบเวลาเซิร์ฟเวอร์โดยใช้โมดูล Node.js moment แล้ว ฟังก์ชัน date() จะสรุปผลด้วยการส่งผลลัพธ์ในการตอบกลับ HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

การเชื่อมต่อฟังก์ชัน HTTP กับโฮสติ้ง Firebase

คุณเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting ได้ คำขอบนเว็บไซต์โฮสติ้ง Firebase ของคุณสามารถส่งพร็อกซีไปยังฟังก์ชัน HTTP เฉพาะได้ สิ่งนี้ยังช่วยให้คุณใช้โดเมนที่คุณกำหนดเองด้วยฟังก์ชัน HTTP เรียนรู้เพิ่มเติมเกี่ยวกับ การเชื่อมต่อ Cloud Functions กับ Firebase Hosting