Правильный способ передачи нескольких значений для одного и того же имени параметра в запросе GET

194

Я смотрю, как правильно передать несколько значений для одного и того же имени параметра в запросе GET.

Я видел такие URL:

http://server/action?id=a&id=b

И я видел такие URL:

http://server/action?id=a,b

Насколько я понимаю, первое правильно, но я не могу найти ссылку на это. Я взглянул на спецификацию http, но ничего не понял о том, как должна составляться часть запроса в URL.

Мне не нужен ответ, который говорит, что «либо в порядке» - если я создаю веб-сервис, я хочу знать, какой из этих методов является стандартным, чтобы люди, использующие мой веб-сервис, знали, как передавать несколько параметров для одного и того же имени.

Итак, кто-то может указать мне на официальный источник справки, чтобы подтвердить, какой вариант является правильным?

stripybadger
источник

Ответы:

166

Действительно, не существует определенного стандарта. Чтобы поддержать эту информацию, взгляните на Википедию в главе Строка запроса . Есть следующий комментарий:

Хотя нет определенного стандарта, большинство веб-платформ позволяют связывать несколько значений с одним полем. [3] [4]

Кроме того, когда вы посмотрите на RFC 3986 , в разделе 3.4 Запрос , нет определения для параметров с несколькими значениями.

Большинство приложений используют первый вариант вы показали: http://server/action?id=a&id=b. Чтобы поддержать эту информацию, взгляните на эту ссылку Stackoverflow и эту ссылку MSDN относящиеся к приложениям ASP.NET, которые используют один и тот же стандарт для параметров с несколькими значениями.

Однако, поскольку вы разрабатываете API-интерфейсы, я предлагаю вам сделать то, что проще для вас, так как вызывающий API не будет иметь особых проблем при создании строки запроса.

EduardoFernandes
источник
В отсутствие какой-либо информации об обратном, я думаю, вы правы - если RFC3986 не определяет стандарт, тогда его нет. Спасибо, Эдуардо.
stripybadger
19
A предложил бы использовать id=a&id=bкак логическое И, так и id=a,bлогическое ИЛИ.
Алексей Скрипник,
17
FWIW PHP не поддерживает чтение аргументов, как ?id=5&id=3. PHP будет читать только одно значение для id здесь. Если я правильно помню, это должно выглядеть так, чтобы он работал с PHP:?id[]=5&id[]=3
Что вы пробовали
3
+1 заsince you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Амр
2
id=a,bделает предположение, что кома ,является допустимым разделителем. Но ваши значения параметров могут содержать ,. Затем клиенту необходимо экранировать ,значения параметров запроса. Но вы могли бы решить ;, лучше. Это означает, что клиент и сервер должны совместно использовать официальный разделитель для вашего API. id=a&id=bне имеет этой проблемы, даже несмотря на то, что она увеличивает URL
Ronan Quillevere
5

Я бы посоветовал посмотреть, как браузеры обрабатывают формы по умолчанию. Например, посмотрите на элемент формы <select multiple>и как он обрабатывает несколько значений из этого примера в w3schools.

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

Для использования PHP:

<select name="cars[]" multiple>

Живой пример сверху на w3schools.com

Сверху, если вы нажмете "saab, opel" и нажмете "отправить", будет получен результат cars = saab & cars = opel . Затем в зависимости от фонового сервера, параметр автомобили должны встретить как массив , который вы можете дополнительно обрабатывать.

Надеюсь, что это поможет любому, кто ищет более «стандартный» способ решения этой проблемы.

phanf
источник