Kodokon kodokon.com

การสร้าง REST API

ออกแบบ REST API ที่สะอาดด้วยเมท็อด HTTP ที่ถูกต้อง รหัสสถานะที่เหมาะสม และการตรวจสอบความถูกต้องของเนื้อความคำขอ

9 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

REST API เปิดให้เข้าถึง ทรัพยากร (resources) (ผู้ใช้ งาน คำสั่งซื้อ) ที่จัดการด้วยเมท็อด HTTP ได้แก่ GET เพื่ออ่าน POST เพื่อสร้าง PUT หรือ PATCH เพื่ออัปเดต และ DELETE เพื่อลบ ธรรมเนียมของมืออาชีพคือ ใช้คำนามพหูพจน์ ไม่ใช้คำกริยาใน URL เด็ดขาด คุณเขียน POST /tasks ไม่ใช่ /createTask มาสร้าง API งานเล็ก ๆ กัน โดยตอนนี้เก็บข้อมูลไว้ในหน่วยความจำก่อน

JAVASCRIPT
import express from "express";

const app = express();
app.use(express.json());

const tasks = [
  { id: 1, title: "Review the module", done: false }
];

app.get("/tasks", (req, res) => {
  res.json(tasks);
});

app.listen(3000);

บรรทัด app.use(express.json()) เป็นสิ่งจำเป็น หากไม่มีมัน req.body จะเป็น undefined สำหรับทุกคำขอแบบ JSON เมื่อมีการสร้าง จงตรวจสอบข้อมูลนำเข้าเสมอ ตอบกลับด้วย 201 และคืนทรัพยากรที่สร้างขึ้น สิ่งนี้ทำให้ไคลเอนต์ได้รับ id ที่เซิร์ฟเวอร์สร้างขึ้น

JAVASCRIPT
app.post("/tasks", (req, res) => {
  const { title } = req.body;
  if (!title) {
    return res.status(400).json({
      error: "The title field is required"
    });
  }
  const task = {
    id: tasks.length + 1,
    title,
    done: false
  };
  tasks.push(task);
  res.status(201).json(task);
});

จงจำรหัสที่คุณจะใช้ทุกวันไว้ 200 อ่านหรืออัปเดตสำเร็จ 201 สร้างทรัพยากรแล้ว 204 สำเร็จโดยไม่มีเนื้อหา (การลบ) 400 คำขอไม่ถูกต้อง 404 ไม่พบทรัพยากร 500 ข้อผิดพลาดของเซิร์ฟเวอร์ กฎคือ ถ้าเป็น 4xx ไคลเอนต์ทำผิด ถ้าเป็น 5xx โค้ดของคุณเองที่ล้มเหลว

JAVASCRIPT
app.delete("/tasks/:id", (req, res) => {
  const id = Number(req.params.id);
  const index = tasks.findIndex((t) => t.id === id);
  if (index === -1) {
    return res.status(404).json({
      error: "Task not found"
    });
  }
  tasks.splice(index, 1);
  res.status(204).end();
});

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. คุณจะคืนรหัสสถานะใดหลังจากสร้างทรัพยากรสำเร็จ?
    • 200
    • 201
    • 204
    • 301
  2. หากขาดบรรทัดใด req.body จะยังคงเป็น undefined สำหรับคำขอแบบ JSON?
    • app.use(express.json())
    • app.use(express.static(...))
    • app.listen(3000)
  3. ไคลเอนต์ส่ง POST มาโดยไม่มีฟิลด์ title ที่จำเป็น API ควรตอบสนองอย่างไรจึงจะถูกต้อง?
    • สร้างทรัพยากรโดยมี title ว่างเปล่า
    • คืนสถานะ 400 พร้อมข้อความแจ้งข้อผิดพลาด
    • คืนสถานะ 500
    • เพิกเฉยต่อคำขอโดยไม่ตอบกลับ