Все статьи

Query String против JSON: почему GET-параметры такие ограниченные

Строка запроса 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 остаётся для коротких, простых параметров.

Попробовать инструмент