เลิกเขียน RESTful API แบบแย่ๆ แล้วหันมาเขียนให้มันถูกต้องตามมาตรฐานกันดีกว่า

ผมเชื่อว่าหลายๆ ที่คนที่เข้ามาอ่านบทความนี้จะต้องทำงานอยู่ในส่วนของ Back-end Developer หรือกำลังเขียน API ด้วย RESTful เราจะไม่พูดถึง SOAP เพราะมันเก่าไป และเดาได้ว่าบางคนคงเขียน API แบบขอไปทีอย่าง เช่น การตั่งชื่อไม่ได้มีหลักการที่ถูกต้อง การเลือกใช้ HTTP Method ก็คงใช่แต่ POST, GET หรืออาจจะไม่เคยเขียนจัดการกับ Error ด้วย HTTP Status Code จากประสบการณที่ผ่านมาหลายปีผมก็ทำงานทั่ง Front-end และ Back-end ผมก็คนนึงที่ไม่ได้ทำตามมาตรฐานสักเท่าไร ยิ่งสมัยเริ่มเขียน API ใหม่ๆ สักสองปีที่แล้วบอกเลยกันเละแน่นอน อิอิ!! แม้แต่ตอนนี้ก็ยังเละอยู่ เดียวเราจะมาดูกันว่า RESTful ที่ดีควรเป็นยังไง

 

1. การตั่งชื่อต้องใช้ nouns อย่าใช้ verbs

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex-md

ข้อควรจำหลีกเลี่ยงการตั่งชื่อด้วย verbs และอย่าตั่งชื่อด้วยตัวเล็กตัวใหญ่

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex2-md

 

2. อย่าใช้ GET ในการแก้ไขข้อมูลใดๆ ทั่งสิ้น หรือสร้างข้อมูลใหม่

แนะนำให้ไปใช้ POST เพื่อความปลอดภัยหลีกเลี่ยงการโดนทำ Injection หรือการส่งค่าไม่พึ่งประสงค์ไปในระบบและนี้คือตัวอย่างที่ผิด

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex3-md

 

3. ให้ใช้คำ nouns แบบพหูพจน์ (plural nouns)

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex4-md

 

4. ใช้ Standard HTTP Method

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex5-md

 

5. เปิดใช้งาน overriding HTTP method

เพราะบาง server หรือบาง Proxy เปิดให้เราส่งได้แค่ GET/POST ดังนั่นจำเป็นต้องทำ HTTP Header X-HTTP-Method-Override เพื่อเปลี่ยนจากการทำ POST ไปเป็น PUT หรือ DELETE เช่น ตัวอย่างการเขียน JQuery เพื่อให้ทำ PUT ผ่าน POST

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex6-js

 

6. ใช้ sub-name ในการเชื่อมความสัมพันธ์ของข้อมูล

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex7-md

 

7. ควรระบุ content-type ของการสื่อสารด้วยทั่ง client และ server

–  ฝั่ง client ในกรณียิงด้วย postman หรือดูตัวอย่างโค้ดในข้อ 4

 –  ในส่วนของ server ผมจะยกตัวอย่าง ExpressJS  ตัว framework ในการทำ back-end ของ NodeJS สำหรับการทำระบุ content-type

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex8-js

 

8. อย่าลืมระบุ version API ด้วย

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex9-md

 

9. ใช้ HTTP Status Codes คู่ไปกับการใช้ Message ในการจัดการกับ Error ของระบบ

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex13-md

 

10. ในการดึงข้อมูลที่ซับซ้อนหรือมี state เยอะๆ ให้ทำ Query String  ด้วย GET

การดึงเอาสถานะของหนังสือที่ยังขายอยู่เช่น

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex10-md

 

หรือการเลือกแสดงผลข้อมูลว่าต้องการที่จะดูฟิลด์ Database ในฟิลด์ไหนบ้าง

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex11-md

 

การทำ sorting หรือ paginate ก็เช่นกัน

https://gist.github.com/avatarr/c7e5e32bc2bf009c2c2acc6e4b9c1266#file-ex12-md

ข้อควรจำ: อย่าลืมเช็ค Escape string ในกรณีที่ฐานข้อมูลเป็นแบบ Relationship เช่นพวกที่ใช้คำสั่ง SQL ทั้งหลายในการคิวรี่และอย่าลืมเช็คความถูกต้องของข้อมูลก่อนส่งไปดึงที่ Database เสมอ เพื่อไม่ให้โดน Cross-site scripting หรือ Injection ต่างๆ แม้แต่ NoSQL เองก็โดย Injection ได้แล้วนะครับ มีข่าวออกมาแล้ว

11. อย่าลืมทำ Document นะครับ ฮ่าๆๆๆ !!!

 

Facebook Comments