Method POST, PUT และ PATCH ต่างกันยังไง

Sakul Montha
2 min readFeb 14, 2019
POST VS PUT VS PATCH

ปัจจุบันเรามักจะใช้ Restful ในการทำ API เชื่อมต่อระหว่าง Client — Server, Server — Server จริง ๆ ตอนนี้มันก็มีวิธีคุยกันอีกหลายอย่าง ไม่ว่าจะเป็น Protobuf, gRPC หรือเก่าหน่อยก็ SOAP หรือพวกพี่ ๆ ยุคบุกเบิกอาจจะสร้าง Protocol ขึ้นมาใช้คุยกันเองเลย

เป็นที่ทราบกันอยู่แล้วว่า Restful API ที่เรากำลังพูดคุยกันอยู่มันใช้ Protocol HTTP ในการสื่อสาร แต่ว่าผมยังเห็นหลาย ๆ API มักจะใช้แค่ GET กับ POST กัน โดย Method ที่ถูกเรียกใช้บ่อย ๆ หนัก ๆ ในการทำแทบจะทุกอย่างคือ Method POST จริง ๆ แล้ว Protocol HTTP มันยังมี Method อื่นที่ถูกสร้างมาเพื่อจุดประสงค์นั้น ๆ อีกนะ

http://

Protocol HTTP

Protocol HTTP มีการเปลี่ยนแปลงมาแล้วหลายครั้ง
โดยใน HTTP/1.1 มีการแก้ไขหลายเรื่องทั้ง Message Syntax and Routing, Semantics and Content, Conditional Requests, Range Requests, Caching, Authentication

1991 v0.9, 1996 v1.0, 1997 v1.1, 2015 v2.0, 2018 v3.0

Protocol HTTP มันไม่ได้มีแค่ GET กับ POST แต่มันยังมี HEAD, PUT, DELETE, TRACE, OPTION, CONNECT, PATCH ด้วย

วันนี้ผมจะมาอธิบายความแตกต่างของ Method POST, PUT และ PATCH ว่ามันแตกต่างกันอย่างไร แล้วเหตุการณ์ใดควรใช้ Method ไหนกันแน่ ฉบับกระชับ

Method POST

HTTP.POST ใช้เมื่อ Client ส่งข้อมูลมาสู่ Server เพื่อมา Create new resource

เช่น /question

Example: POST Body

Method PUT

HTTP.PUT ใช้เมื่อ Client ส่งข้อมูลมาสู่ Server โดยมากจะใช้เพื่อทำการ Update ข้อมูลที่มีอยู่แล้วในระบบ จะใช้ Path เดียวกันกับ Method POST ก็ได้ เพียงแค่เพิ่ม Context path เข้าไปแล้วเปลี่ยน Method ที่รับ

เช่น /question/{question-id}

Example: PUT Body

Method PATCH

HTTP.PATCH ใช้เมื่อ Client ส่งข้อมูลมาสู่ Server โดยมากจะใช้เพื่อทำการ Update ข้อมูลที่มีอยู่แล้วในระบบ แต่จะแตกต่างกัน ที่เห็นได้ชัดก็คือ ข้อมูลที่จะถูกส่งเข้ามา ไม่จำเป็นต้องส่งเข้ามาทั้งหมด ส่งมาแค่ฟิลด์ที่ต้องการจะแก้ไขเท่านั้น ฟิลด์ไหนที่ไม่ถูกส่งมาจะไม่ถูก Update

เช่น /question/{question-id}

Example: PATCH Body

จะเห็นได้ว่า PUT กับ PATCH นั้นมันก็คือการ Update เหมือนกันทั้งคู่ แต่ความแตกต่างของมันก็คือ PUT นั้นจะต้องส่งข้อมูลเก่ามาทั้งหมด ไม่อย่างนั้นมันจะเป็นการ Update ทับไปเลย. บางคนอาจจะ design ให้บังคับว่าต้องส่งมา หรือบางคนอาจจะ design ให้ถ้าไม่ส่งมาก็ไม่ยุ่งอะไร… แต่จริง ๆ แล้วเรายังมี Method PATCH ที่เหมาะที่จะเอาไว้ทำการ Update เพียงแค่บางฟิลด์ที่ต้องการเท่านั้น ตรงนี้จะช่วยทำให้เข้าใจได้มากขึ้น แถมยังลด cost ในการ transfer data อีกด้วย

Status Code

เรื่องของ Status Code นั้นก็สำคัญไม่แพ้กัน เราควรที่จะกำหนด Status Code ที่จะออกไปสู่คนที่เรียกมาให้เป็นสากลด้วย

Informational 1XX
Successful 2XX
Redirection 3XX
Client Error 4XX
Server Error 5XX

Summary

ทั้งหมดที่เขียนมานั้นก็หวังว่าจะเป็นประโยชน์แก่ผู้ที่จะสร้าง API ขึ้นมาจะได้สร้างให้มันเป็น Standard ตามที่เขาอุตส่าห์กำหนดมาให้กันนะครับ

ทั้งนี้ทั้งนั้นมันก็ขึ้นอยู่กับงานปัจจุบันที่ท่านได้ทำอยู่ด้วยนะครับ อาจจะมีเหตุผลบางประการที่จำเป็นต้องใช้ท่าอื่น ๆ รวมถึง Method อื่น ๆ ที่ผมไม่ได้หยิบยกมาเขียนด้วย ก็เอาเป็นรู้ไว้ใช่ว่านะครับ ฮ่า ๆ

จำง่าย ๆ วันหลังจะได้เอาไปดีไซน์ให้เหมาะสมกับ API ที่จะสร้าง
Method POST ใช้ Create
Method PUT ใช้ Update ทั้งหมด
Method PATCH ใช้ Update บางฟิลด์

--

--

Sakul Montha

Chief Product Officer, a man who’s falling in love with the galaxy.