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


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

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

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

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

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

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

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

การใช้แอป Express ที่มีอยู่

การใช้ 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

ใช้โมดูลมิดเดิลแวร์กับฟังก์ชันคลาวด์

หากคุณต้องการฉีดการพึ่งพามิดเดิลแวร์สำหรับสิ่งต่างๆ เช่น การสนับสนุนคุกกี้หรือ 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

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

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

การเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting

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