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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/web/web-api-101/grouping-api-02.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
