9.มาจัดกลุ่ม API กัน (2/2)

💬 หลังจากที่เราได้รู้ไปละว่าเราสามารถจัดกลุ่ม API เพื่อช่วยให้คนที่เข้ามาใช้งาน API สามารถเข้าใจการทำงานของ API เราได้ง่ายขึ้น คราวนี้เราจะมาลองดูกันว่า ถ้าเราจัดกลุ่ม และนำ verb มาช่วยด้วยมันจะทำให้ API ของเราเข้าใจได้ง่ายเป็นสากลได้ยังไงกันบ้างครับ

😢 ปัญหา

ตัวอย่างของ API ที่เรามีปัจจุบัน

Verb

Path

คำอธิบาย

GET

/api/Product/GetProducts

ดึงข้อมูลสินค้าทั้งหมด

GET

/api/Product/Get/{id}

ดึงข้อมูลสินค้า 1 ชิ้น

POST

/api/Product/CreateNewProduct

สร้างสินค้าใหม่

PUT

/api/Product/ChangeProduct/{id}

เปลี่ยนแปลงข้อมูลสินค้า

DELETE

/api/Product/DeleteProduct/{id}

ลบสินค้า

สมมุติว่าเราต้องมาใช้ API ที่อยู่ในตารางด้านบน เราจะพบปัญหาว่า เราจะไม่มีทางรู้เลยว่า API นั้นๆมันมีไว้ใช้ทำอะไรนอกจากไปอ่านคำอธิบายของมัน ถึงจะเข้าใจ

😄 วิธีแก้ปัญหา

จากตัวอย่างที่ว่ามาด้านบน เราลองใช้ verb ต่างๆเข้ามาช่วยดูซิ ซึ่งหน้าที่ของ verb แต่ละตัวมีหมายความตารางด้านล่างนี้

Verb

ความหมาย

GET

ขอข้อมูล

POST

สร้างข้อมูลใหม่

PUT

อัพเดทข้อมูล

DELETE

ลบข้อมูล

ดังนั้นผมจะลองเขียน API ใหม่ โดยให้ verb เป็นตัวกำหนดพฤติกรรมของมันดู เราก็ได้จะออกมาเป็นตารางด้านล่างนี้

Verb

Path

คำอธิบาย

GET

/api/Product

ดึงข้อมูลสินค้าทั้งหมด

GET

/api/Product/{id}

ดึงข้อมูลสินค้า 1 ชิ้น

POST

/api/Product

สร้างสินค้าใหม่

PUT

/api/Product/{id}

เปลี่ยนแปลงข้อมูลสินค้า

DELETE

/api/Product/{id}

ลบสินค้า

จากตารางด้านบนเราจะเห็นว่า API ของผมเหลือแค่แบบซ้ำๆกัน แต่ว่าเราใช้ verb เป็นตัวช่วยในการแยกการทำงานออกจากกัน ดังนั้น

ถ้าผมอยากดึงข้อมูลสินค้า 1 ตัวผมก็เรียกใช้ /api/Product/{id} ถ้าผมอยากดึงรายการสินค้าทั้งหมดผมก็ใช้ /api/Product

จะเห็นว่าถ้าเราเอาคอนเซ็ปนี้ไปใช้กับ API อื่นๆบ้าง เช่นการสั่งซื้อสินค้า เราก็จะได้เป็น

Verb

Path

คำอธิบาย

GET

/api/ProductOrder

ดึงข้อมูลการสั่งซื้อสินค้าทั้งหมด

GET

/api/ProductOrder/{id}

ดึงข้อมูลการสั่งซื้อสินค้า 1 ชิ้น

POST

/api/ProductOrder

สร้างการสั่งซื้อสินค้าใหม่

ซึ่งเราจะเห็นได้ว่า แม้ว่าผมจะมี Product API และ Product Order API ที่ทำงานไม่เหมือนกันก็ตาม แต่ด้วยการใช้ verb เข้ามาช่วย มันจะทำให้การทำความเข้าใจในการติดต่อกับ API ลดลง และในที่สุดเราก็แทบจะไม่จำเป็นต้องใส่คำอธิบายลงไปใน API เลยแต่ในขณะที่คนมาใช้ API ของเราก็ยังเข้าใจว่ามันทำงานยังไงอยู่นั่นเอง เช่น

ถ้าผมอยากดึงข้อมูลการสั่งซื้อสินค้า 1 ตัวผมก็เรียกใช้ /api/ProductOrder/{id} ถ้าผมอยากดึงรายการสั่งซื้อสินค้าทั้งหมดผมก็ใช้ /api/ProductOrder