article

API Design - การออกแบบ API ให้ใช้งานง่ายและปลอดภัย

2 min read

ผมเคยเขียนเส้น API แบบเข้าใจยากจนการใช้งานและกลับมาแก้นั้นปวดหัวมาก ๆ

เวลาพูดถึง API หลายคนอาจจะคิดว่า ก็แค่ endpoint ไว้ยิง request – response กลับมา จบ แต่จริง ๆ แล้ว API มันคือ “ภาษากลาง” ที่เราใช้คุยกับนักพัฒนาคนอื่น ๆ หรือแม้กระทั่งทีมตัวเองในอนาคตเลยนะ

การออกแบบ API ที่ดี ไม่ได้ช่วยแค่ตอนใช้งาน แต่ยังช่วยลดปัญหาในอนาคต เวลา scale ระบบ หรือเวลา dev ใหม่เข้ามาทำงาน


ทำไม API Design ถึงสำคัญ?

  • dev คนอื่นเข้าใจได้ง่าย โดยไม่ต้องนั่งงง
  • ถ้าวางรูปแบบให้สม่ำเสมอ จะช่วยลดเวลา debug ได้เยอะ
  • เวลา API มันใหญ่ขึ้น เราจะไม่เจอปัญหาเปลี่ยน endpoint ที ระบบพังทั้งแอป
  • ช่วยเรื่อง security ด้วย ป้องกันการเผลอปล่อยข้อมูลหลุด

หลักง่าย ๆ ในการออกแบบ API ✨

1. คิดเป็นทรัพยากร (Resource-Oriented)

เช่น เรามี users, orders, products ก็ทำแบบนี้

GET /users           -> เอาข้อมูล user ทั้งหมด
GET /users/123       -> เอาข้อมูล user คนที่ id=123
POST /users          -> สร้าง user ใหม่
PUT /users/123       -> อัปเดต user ที่มี id=123
DELETE /users/123    -> ลบ user

Status Code

การส่งเสตตัสโค้ดที่ถูกต้องช่วยให้ client รู้ว่า request สำเร็จหรือไม่ และเกิดอะไรขึ้นบ้าง เพื่อที่จะได้จัดการกับ response ได้ถูกต้อง

Status Codeความหมายใช้เมื่อ
200 OKสำเร็จใช้กับ GET, PUT, PATCH, DELETE ที่ทำงานสำเร็จ
201 Createdสร้าง resource ใหม่สำเร็จใช้กับ POST เมื่อมีการสร้างข้อมูลใหม่
202 Acceptedคำสั่งถูกส่งไปแล้ว แต่ยังประมวลผลไม่เสร็จใช้กับงาน async เช่น queue
204 No Contentสำเร็จ แต่ไม่มีข้อมูลส่งกลับใช้กับ DELETE หรือ update ที่ไม่ต้องส่ง response
400 Bad RequestRequest ไม่ถูกต้องข้อมูลไม่ครบ, type ไม่ถูกต้อง
401 Unauthorizedไม่ได้ login หรือ token ไม่ถูกต้องต้องมีการยืนยันตัวตนก่อน
403 Forbiddenมี token แล้วแต่ไม่มีสิทธิ์เข้าถึงเช่น user ธรรมดาไปเรียก API admin
404 Not Foundไม่เจอ resourceเช่น GET /users/9999 แล้วไม่มี
405 Method Not Allowedใช้ HTTP method ไม่ถูกเช่น DELETE /login
409 Conflictมีความขัดแย้งเช่น สร้าง user ที่ email ซ้ำ
422 Unprocessable Entityข้อมูลถูกส่งมาแล้วแต่ validate ไม่ผ่านเช่น password สั้นเกินไป
429 Too Many Requestsโดน rate limitส่ง request ถี่เกินไป
500 Internal Server Errorระบบพังในฝั่ง serverbug, crash หรือ error ที่ไม่คาดคิด
502 Bad Gatewayปัญหาจาก proxy หรือ service ข้างหลังเช่น upstream พัง
503 Service Unavailableเซิร์ฟเวอร์ไม่พร้อมให้บริการdowntime, maintenance
504 Gateway Timeoutรอ service อื่นนานเกินไปเช่น timeout ระหว่าง API → DB

ข้อมูลที่ส่งกลับต้องมีโครงสร้างที่ชัดเจน

เช่น ถ้า API เราส่งข้อมูล user กลับมา ควรจะมีโครงสร้างแบบนี้ คือ data กับ meta แยกกันชัดเจน โดยแยก Object ออกมา ตัวอย่างเช่น data = เนื้อหาหลัก meta = ข้อมูลเสริม เช่น request_id, pagination, timestamp

ถ้า API เรามีหลาย resource ที่ส่งกลับมาใน response เดียวกัน ควรจะจัดกลุ่ม resource เหล่านั้นให้อยู่ใน Object ของตัวเองและเหมือนกันทุกเส้น เช่น

{
  "data": {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com"
  },
  "meta": {
    "request_id": "abc-123",
    "timestamp": "2025-09-15T12:34:56Z"
  }
}

ข้อความ error ต้องชัดเจนและมีประโยชน์

เวลามี error เกิดขึ้น ควรส่งข้อมูลที่ช่วยให้ client เข้าใจว่าเกิดอะไรขึ้น และจะแก้ไขยังไง พร้อมกับเมื่อโค้ดมีการดักจับ error ควรส่งฟอร์มแบบเดียวกันออกมา เช่น

{
  "error": {
    "code": "OUT_OF_STOCK",
    "message": "Product with ID ..... is out of stock",
    "hint": "ลองเลือกสินค้าอื่น หรือรอสินค้าเข้าใหม่"
  }
}

และทุกอย่างนี้ควรจะมีเอกสาร (Documentation) ที่ชัดเจนและอัปเดตเสมอ