Prawidłowy sposób przekazywania wielu wartości dla tej samej nazwy parametru w żądaniu GET


194

Sprawdzam, jaki jest prawidłowy sposób przekazywania wielu wartości dla tej samej nazwy parametru w żądaniu GET.

Widziałem takie adresy URL:

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

I widziałem takie adresy URL:

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

Rozumiem, że pierwsza jest poprawna, ale nie mogę znaleźć na to odniesienia. Spojrzałem na specyfikację http, ale nie widziałem nic o tym, jak należy utworzyć część adresu URL dotyczącą zapytania.

Nie chcę odpowiedzi, która brzmi: „albo jest w porządku” - jeśli tworzę usługę internetową, chcę wiedzieć, która z tych metod jest standardowa, aby osoby korzystające z mojej usługi wiedziały, jak przekazać wiele parametrów o tej samej nazwie.

Czy ktoś może wskazać mi oficjalne źródło informacji, aby potwierdzić, która opcja jest poprawna?

Odpowiedzi:


166

Rzeczywiście nie ma określonego standardu. Aby wesprzeć te informacje, zajrzyj na wikipedię, w rozdziale Ciąg zapytania . Istnieje następujący komentarz:

Chociaż nie ma definitywnego standardu, większość frameworków internetowych pozwala na powiązanie wielu wartości z jednym polem. [3] [4]

Ponadto, gdy spojrzysz na RFC 3986 , w sekcji 3.4 Zapytanie , nie ma definicji parametrów o wielu wartościach.

Większość aplikacji korzysta już pokazany pierwszą opcję: http://server/action?id=a&id=b. Aby wesprzeć te informacje, spójrz na to łącze Stackoverflow i to łącze MSDN dotyczące aplikacji ASP.NET, które używają tego samego standardu dla parametrów o wielu wartościach.

Ponieważ jednak opracowujesz interfejsy API, sugeruję zrobienie tego, co jest dla ciebie najłatwiejsze, ponieważ wywołujący interfejs API nie będzie miał większych problemów z utworzeniem ciągu zapytania.


Wobec braku jakichkolwiek informacji przeciwnych, myślę, że masz rację - jeśli RFC3986 nie określa standardu, nie ma go. Dzięki Eduardo.
stripybadger

19
Sugeruje użycie id=a&id=bjako logicznego AND i id=a,bjako logicznego OR.
Alex Skrypnyk

17
FWIW PHP nie obsługuje czytania takich argumentów ?id=5&id=3. PHP odczyta tutaj tylko jedną wartość dla id. Jeśli dobrze pamiętam, musiałoby to wyglądać tak, aby działało z PHP:?id[]=5&id[]=3
Co wypróbowałeś

3
+1 zasince 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,bprzyjmuje założenie, że przecinek ,jest prawidłowym separatorem. Ale wartości parametrów mogą zawierać ,. Następnie klient musi uciec ,w wartościach parametrów zapytania. Ale możesz zdecydować, że ;jest lepiej. Oznacza to, że klient i serwer powinny udostępniać oficjalny ogranicznik dla interfejsu API. id=a&id=bnie ma tego problemu, mimo że wydłuża adresy URL
Ronan Quillevere,

5

Sugerowałbym sprawdzenie, jak przeglądarki domyślnie obsługują formularze. Na przykład spójrz na element formularza <select multiple>i sposób, w jaki obsługuje on wiele wartości z tego przykładu w 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>

Do użytku w PHP:

<select name="cars[]" multiple>

Przykład na żywo z góry na w3schools.com

Z góry, jeśli klikniesz „saab, opel” i klikniesz prześlij, wygeneruje wynik cars = saab & cars = opel . Następnie w zależności od serwera zaplecza parametr cars powinien pojawić się jako tablica, którą można dalej przetwarzać.

Mam nadzieję, że pomoże to każdemu, kto szuka bardziej „standardowego” sposobu rozwiązania tego problemu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.