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


194

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

Я бачив такі URL-адреси:

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

І я бачив такі URL-адреси:

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

Я розумію, що перший є правильним, але я не можу знайти жодного посилання на це. Я подивився на http-специфікацію, але не побачив нічого про те, як слід складати частину "запиту" URL-адреси.

Я не хочу відповіді, яка говорить "або добре" - якщо я будую веб-сервіс, я хочу знати, який із цих методів є стандартним, щоб люди, які використовують мою веб-службу, знали, як передавати кілька параметрів для одного імені.

Тож чи може хтось вказати мені на офіційне довідкове джерело, щоб підтвердити, який варіант є правильним?

Відповіді:


166

Дійсно, не існує визначеного стандарту. Щоб підтримати цю інформацію, перегляньте wikipedia у розділі Рядок запитів . Є такий коментар:

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

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

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

Однак, оскільки ви розробляєте API, я пропоную вам зробити те, що найпростіше для вас, оскільки абонент API не матиме великих проблем зі створенням рядка запиту.


За відсутності будь-якої інформації, навпаки, я думаю, ви праві - якщо RFC3986 не вказує стандарт, то його немає. Дякую Едуардо.
stripybadger

19
A запропонував би використовувати id=a&id=bяк булеві AND, так і 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.
Amr

2
id=a,bробить припущення, що кома ,є дійсним роздільником. Але значення параметрів можуть містити ,. Тоді клієнту потрібно вийти ,з значень параметрів запиту. Але ти міг би вирішити ;, що краще. Це означає, що клієнт і сервер повинні мати офіційний роздільник для вашого API. id=a&id=bЦя проблема не має, навіть якщо це робить URL-адресами довше
Ронан Кіллевер

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" і натисніть кнопку "Підтвердити", це призведе до отримання автомобілів = saab & cars = opel . Тоді, залежно від сервера бек-енду, автомобілі параметрів повинні надходити як масив, який ви можете далі обробляти.

Сподіваємось, це допоможе тим, хто шукає більш "стандартний" спосіб вирішення цієї проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.