# 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**
