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?

stripybadger
źródło

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.

EduardoFernandes
źródło
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.

phanf
źródło