บทความทั้งหมด

คิวรีสตริงกับ JSON: อะไรเหมาะกว่าสำหรับส่งข้อมูลที่ซับซ้อน

Query string ของ URL เป็นรูปแบบการส่งข้อมูลที่เรียบง่ายที่สุดเท่าที่มี — รายการคู่ key=value คั่นด้วยเครื่องหมาย & แต่ความเรียบง่ายนี้จะกลายเป็นปัญหาทันทีที่ต้องส่งอะไรที่ซับซ้อนกว่ารายการข้อความแบบแบน ๆ

ทำไม query string ถึงมีข้อจำกัด

รูปแบบ query string ถูกออกแบบมาแต่เดิมสำหรับฟอร์ม HTML ธรรมดา และไม่มีแนวคิดเรื่องชนิดข้อมูล การซ้อนกัน หรือ array อยู่ในตัวเลยแม้แต่น้อย ทุกอย่างในนั้นคือข้อความล้วน ๆ ดังนั้นตัวเลข 42 กับสตริง "42" จึงแยกกันไม่ออกจนกว่าจะมีโค้ดมาแปลความหมายให้ชัดเจน

การเข้ารหัส array: ธรรมเนียมของ PHP ในวงการเว็บไทย

PHP ผ่านทาง WordPress และเฟรมเวิร์กอย่าง Laravel (ซึ่งเป็นเฟรมเวิร์กเดียวกับที่เว็บไซต์นี้ใช้) ยังคงเป็นหนึ่งใน backend ที่นักพัฒนาไทยใช้กันอย่างแพร่หลาย ส่วนหนึ่งเพราะโฮสติ้งราคาประหยัดที่รองรับ PHP หาได้ง่ายมาก PHP แปลง tags[]=a&tags[]=b เป็น array ได้เองโดยไม่ต้องพึ่ง library เพิ่มเติม และแปลง filter[status]=active เป็นโครงสร้างซ้อนกันได้เช่นกัน ในขณะที่ระบบนิเวศอื่นมีธรรมเนียมต่างออกไป เช่น ASP.NET มักคาดหวังให้ใช้ key เดิมซ้ำโดยไม่มีวงเล็บเหลี่ยม (tags=a&tags=b) ถ้าฝั่ง client กับ server ตกลงธรรมเนียมไม่ตรงกัน ข้อมูล array จะหายไปเงียบ ๆ หรือผิดเพี้ยนโดยไม่มีการแจ้งเตือน

ทำไม JSON แก้ปัญหานี้ได้

JSON มีชนิดข้อมูลในตัว (ตัวเลข, boolean, null) และรองรับ object กับ array แบบซ้อนกันได้ตามธรรมชาติโดยไม่ต้องมีข้อตกลงเรื่องการเข้ารหัสใด ๆ เพิ่มเติม นี่คือเหตุผลที่ข้อมูลซับซ้อนใน body ของคำขอ POST มักถูกส่งเป็น JSON ในขณะที่ query string ถูกสงวนไว้สำหรับพารามิเตอร์ง่าย ๆ แบบแบน เช่น ตัวกรองหรือหมายเลขหน้า

ใช้ทำอะไรได้บ้าง

  • ตรวจสอบให้แน่ชัดว่า backend คาดหวังพารามิเตอร์แบบ array ใน query string ในรูปแบบใด
  • แปลงพารามิเตอร์ของ URL เป็น JSON เพื่อให้ debug ได้ง่ายขึ้น
  • เข้าใจว่าทำไมโครงสร้างข้อมูลที่ซับซ้อนจึงควรส่งด้วยวิธีอื่นแทนพารามิเตอร์ GET

ข้อจำกัดความยาวของ URL

เบราว์เซอร์และเซิร์ฟเวอร์ส่วนใหญ่จำกัดความยาว URL ไว้ที่ประมาณ 2000 ตัวอักษร (ค่าที่แน่นอนขึ้นอยู่กับเบราว์เซอร์และเว็บเซิร์ฟเวอร์) ดังนั้น query string จึงไม่เหมาะกับการส่งข้อมูลปริมาณมากในทางกายภาพ นี่เป็นอีกเหตุผลที่คำขอ POST พร้อม JSON body เป็นตัวเลือกมาตรฐานสำหรับฟอร์มที่ซับซ้อนหรือข้อมูลแบบ array ในขณะที่ GET พร้อม query string ยังคงเหมาะกับพารามิเตอร์ที่สั้นและเรียบง่ายเท่านั้น

ลองใช้เครื่องมือ