Query string của URL là định dạng truyền dữ liệu đơn giản nhất từng có: một danh sách các cặp key=value ngăn cách nhau bởi dấu &. Nhưng sự đơn giản này lại trở thành vấn đề ngay khi bạn cần truyền thứ gì đó phức tạp hơn một danh sách chuỗi phẳng.
Vì sao query string bị giới hạn
Định dạng query string vốn được thiết kế cho các form HTML đơn giản và không có khái niệm sẵn có về kiểu dữ liệu, lồng nhau (nesting) hay mảng. Mọi thứ trong đó đều là văn bản thuần, nên số 42 và chuỗi "42" không thể phân biệt được cho đến khi có code parse chúng một cách tường minh.
Mã hóa mảng: quy ước của PHP trong hệ sinh thái web phổ biến ở Việt Nam
PHP — thông qua WordPress lẫn các framework như Laravel (chính là framework của trang này) — vẫn là một trong những hệ sinh thái backend được nhiều lập trình viên Việt Nam sử dụng nhất, một phần nhờ hosting giá rẻ hỗ trợ PHP rất phổ biến. PHP hiểu ngay tags[]=a&tags[]=b là một mảng, và filter[status]=active là một cấu trúc lồng nhau, hoàn toàn không cần thư viện bổ sung. Các hệ sinh thái khác lại có quy ước riêng — ASP.NET thường mong đợi cùng một key được lặp lại mà không có dấu ngoặc vuông: tags=a&tags=b. Nếu client và server không thống nhất quy ước, dữ liệu mảng sẽ âm thầm bị mất hoặc sai lệch.
Vì sao JSON giải quyết được vấn đề này
JSON có sẵn các kiểu dữ liệu (số, boolean, null) và hỗ trợ tự nhiên cho object cũng như mảng lồng nhau mà không cần bất kỳ quy ước mã hóa nào. Đó là lý do dữ liệu phức tạp trong body của request POST thường được gửi dưới dạng JSON, còn query string chỉ dành cho các tham số đơn giản, phẳng như bộ lọc hay số trang.
Dùng để làm gì
- Kiểm tra chính xác backend mong đợi nhận tham số dạng mảng trong query string theo định dạng nào.
- Chuyển đổi tham số URL sang JSON để debug dễ dàng hơn.
- Hiểu vì sao một cấu trúc dữ liệu phức tạp nên được gửi bằng cách khác thay vì qua tham số GET.
Giới hạn độ dài URL
Hầu hết trình duyệt và server giới hạn độ dài URL khoảng 2000 ký tự (giá trị chính xác tùy vào trình duyệt và web server), nên query string về mặt vật lý không phù hợp để mang khối lượng dữ liệu lớn. Đây là một lý do nữa khiến request POST với body JSON trở thành lựa chọn chuẩn cho form phức tạp hoặc dữ liệu dạng mảng, trong khi GET với query string vẫn chỉ dành cho các tham số ngắn, đơn giản.