Строка запроса URL (query string) — самый простой формат передачи данных, какой только существует: список пар ключ=значение, разделённых амперсандом. Но эта простота становится проблемой, как только нужно передать что-то сложнее плоского списка строк.
Почему query string ограничен
Формат query string исторически проектировался для простых HTML-форм и не имеет встроенного понятия типов данных, вложенности или массивов. Всё в нём — просто текстовые строки, поэтому число 42 и строка "42" неотличимы друг от друга, пока код явно их не распарсит.
Массивы в query string: конвенция PHP
PHP — один из немногих языков, где парсинг массивов из query string встроен прямо в рантайм: строка tags[]=a&tags[]=b автоматически становится массивом $_GET['tags'] = ['a', 'b'], а filter[status]=active&filter[city]=msk — вложенным ассоциативным массивом. Эта конвенция с квадратными скобками особенно заметна в экосистемах с сильным присутствием PHP-фреймворков вроде Bitrix или Laravel (на котором, кстати, построен и этот сайт) — в других экосистемах, например ASP.NET, тот же массив обычно передают повторяющимся ключом без скобок: tags=a&tags=b.
Почему JSON решает эту проблему
JSON имеет встроенные типы (числа, булевы значения, null) и естественную поддержку вложенных объектов и массивов без каких-либо соглашений о кодировании. Именно поэтому сложные данные в теле POST-запроса обычно передают как JSON, а query string оставляют для простых плоских параметров вроде фильтров или номера страницы.
Зачем это нужно
- Проверить, как именно бэкенд ожидает получить массив параметров в query string.
- Конвертировать параметры URL в JSON для удобной отладки.
- Понять, почему сложную структуру данных лучше передавать не через GET-параметры.
Ограничение длины URL
Большинство браузеров и серверов ограничивают длину URL примерно 2000 символами (точное значение зависит от браузера и веб-сервера), так что query string физически не подходит для передачи больших объёмов данных. Это ещё одна причина, почему POST-запросы с телом JSON — стандартный выбор для сложных форм или массивов данных, тогда как GET с query string остаётся для коротких, простых параметров.