У меня возникают проблемы с поиском достоверной информации о поведении с повторяющимися полями строки запроса HTTP GET, например
http://example.com/page?field=foo&field=bar
и, в частности, соблюдается ли порядок. Большинство веб-ориентированных языков создают массив, содержащий как foo, так и bar, связанные с ключевым "field", но я хотел бы знать, существует ли авторитетное утверждение (например, в RFC) по этому поводу. В RFC 3986 есть раздел 3.4. Query
, который относится к парам ключ = значение, но ничего не говорится о том, как интерпретировать порядок, дублирование полей и так далее. Это имеет смысл, поскольку это зависит от серверной части, а не в рамках этого RFC ...
Хотя стандарт де-факто существует, я бы хотел увидеть его авторитетный источник, просто из любопытства.
Ответы:
На это нет никаких спецификаций . Вы можете делать, что хотите.
Типичные подходы включают в себя: "первый заданный", "последний заданный", "массив всего", "строка-соединение-с-запятой-всего".
Предположим, необработанный запрос:
Затем существуют различные варианты того, что
request.query['tag']
должно получиться, в зависимости от языка или фреймворка:источник
Могу подтвердить, что для PHP (по крайней мере, в версии 4.4.4 и новее) это работает так:
приводит к:
Но
приводит к:
Это поведение одинаково для данных GET и POST.
источник
[]
Суффикс кажется, действительно странное поведение, но если вы пытаетесь отправить массив в качестве аргумента с помощью JQuery - х.ajax()
, то он будет автоматически добавлять их для вас таким же образом. Похоже, это на пользу пользователям PHP.$foo[] = 1
добавляется к массиву. Django (Python) также делает то же самое.Ответ Ифельдблюма идеален.
Просто примечание о пятом поведении, которое я заметил недавно: на Windows Phone открытие приложения с uri с повторяющимся ключом запроса приведет к NavigationFailed с:
Виновник
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Так что система даже не позволит вам справиться с этим так, как вы хотите, она запретит это. У вас остается единственное решение - выбрать собственный формат (CSV, JSON, XML, ...) и uri-escape-it.
источник
NavigationFailed
такой URI. Но, простите меня, я отказался от разработки для Windows (Phone) через месяц после этой публикации и перешел на macOS (iOS), поэтому сейчас я больше не могу помогать отслеживать эту проблему.Большинство (все?) Фреймворков не дают никаких гарантий, поэтому предположим, что они будут возвращены в случайном порядке.
Всегда выбирайте самый безопасный подход.
Например, интерфейс java HttpServlet: ServletRequest.html # getParameterValues
Даже метод getParameterMap не упоминает о порядке параметров (на порядок итератора java.util.Map также нельзя полагаться).
источник
Обычно повторяющиеся значения параметров, например
приведет к единственному параметру queryString, который является массивом:
Я видел такое поведение в ASP, ASP.NET и PHP4.
источник
У меня такой же вопрос. Я пишу функцию javascript для анализа и преобразования запросов. Я не знаю, есть ли в строке запроса повторяющиеся имена или имя в скобках, например x [] = 1 & x [] = 2, является стандартным, хотя некоторые языки поддерживают этот формат.
Но я обнаружил, что у Chrome и Firefox есть новый класс с именем,
URLSeachParams
и он поддерживает только самый простой формат какname=value
. Если в строке запроса есть повторяющиеся имена,get
методURLSearchParams
возвращает только первое.Так что лично, возможно, самый простой URL-адрес без повторяющихся имен намного безопаснее в будущем.
источник
URLSearchParams.getAll('x')