Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

การใช้วัตถุคำขอและการตอบสนองด่วน

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

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

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

ใช้ App เป็นอาร์กิวเมนต์สำหรับ onRequest() คุณสามารถส่งแอพพลิเคเอ็กซ์เพรสที่เต็มไปด้วยฟังก์ชั่น 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 ประกอบด้วยรายการต่อไปนี้ ตามลำดับ:

  • ภูมิภาค (หรือภูมิภาค) ที่คุณปรับใช้ฟังก์ชันของคุณ บางฟังก์ชั่นการผลิตอาจต้อง explictly กำหนด สถานที่ตั้ง เพื่อลดแฝงเครือข่าย
  • รหัสโปรเจ็กต์ 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 บัฟเฟอร์ )
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() มิฉะนั้น ฟังก์ชันของคุณอาจทำงานต่อไปและถูกบังคับให้ยุติโดยระบบ ดูเพิ่มเติม ซิงค์ Async และสัญญา

หลังจากเรียกและการจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้ Node.js moment โมดูลที่ 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 Hosting สามารถพร็อกซีไปยังฟังก์ชัน HTTP เฉพาะได้ นอกจากนี้ยังช่วยให้คุณใช้โดเมนที่กำหนดเองด้วยฟังก์ชัน HTTP เรียนรู้เพิ่มเติมเกี่ยวกับ การเชื่อมต่อฟังก์ชั่นคลาวด์เพื่อ Firebase โฮสติ้ง