Mam problem ze znalezieniem autorytatywnych informacji o zachowaniu w zduplikowanych polach ciągu zapytania HTTP GET, takich jak
http://example.com/page?field=foo&field=bar
aw szczególności czy zamówienie jest zachowane czy nie. Większość języków zorientowanych na sieć tworzy tablicę zawierającą zarówno foo, jak i bar skojarzone z kluczowym „polem”, ale chciałbym wiedzieć, czy istnieje autorytatywne stwierdzenie (np. W specyfikacji RFC) dotyczące tego punktu. RFC 3986 zawiera sekcję 3.4. Query
, która odwołuje się do par klucz = wartość, ale nie powiedziano nic o tym, jak interpretować kolejność, zduplikowane pola i tak dalej. Ma to sens, ponieważ jest zależne od zaplecza, a nie w zakresie tego RFC ...
Chociaż faktycznie istnieje standard, chciałbym zobaczyć wiarygodne jego źródło, tak z ciekawości.
Odpowiedzi:
Nie ma specyfikacji na ten temat. Możesz robić, co chcesz.
Typowe podejścia obejmują: pierwszy-dany, ostatni-dany, tablica-wszystkiego, łańcuch-łączony-z-przecinkiem-wszystkiego.
Załóżmy, że surowe żądanie to:
Istnieją różne opcje tego, co
request.query['tag']
powinno dać, w zależności od języka lub struktury:źródło
Mogę potwierdzić, że dla PHP (przynajmniej w wersji 4.4.4 i nowszych) działa to tak:
prowadzi do:
Ale
prowadzi do:
To zachowanie jest takie samo dla danych GET i POST.
źródło
[]
Przyrostek wydaje się bardzo dziwne zachowanie, ale jeśli spróbujesz wysłać tablicę jako argument za pośrednictwem jQuery.ajax()
, a następnie zostanie ona automatycznie dodać je do Ciebie w ten sam sposób. Wygląda na to, że jest to korzystne dla użytkowników PHP.$foo[] = 1
dołączany do tablicy. Django (Python) również robi to samo.Odpowiedź yfeldblum jest doskonała.
Tylko uwaga o piątym zachowaniu, które zauważyłem niedawno: w Windows Phone otwarcie aplikacji z uri ze zduplikowanym kluczem zapytania spowoduje NavigationFailed with:
Winowajcą jest
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Więc system nawet nie pozwoli ci obsłużyć tego tak, jak chcesz, zabroni tego. Pozostaje Ci jedyne rozwiązanie pozwalające wybrać własny format (CSV, JSON, XML, ...) i uri-escape-it.
źródło
NavigationFailed
taki identyfikator URI. Ale, wybaczcie, porzuciłem programowanie dla Windows (Phone) miesiąc po tym poście i przeniosłem się na macOS (iOS), więc nie mogę już pomóc w śledzeniu tego problemu w dzisiejszych czasach.Większość (wszystkich?) Frameworków nie daje żadnych gwarancji, więc załóżmy, że zostaną zwrócone w losowej kolejności.
Zawsze wybieraj najbezpieczniejsze podejście.
Na przykład interfejs Java HttpServlet: ServletRequest.html # getParameterValues
Nawet metoda getParameterMap nie wspomina o kolejności parametrów (nie można również polegać na kolejności iteratora java.util.Map).
źródło
Zwykle zduplikowane wartości parametrów, takie jak
wynik w pojedynczym parametrze queryString, który jest tablicą:
Widziałem to zachowanie w ASP, ASP.NET i PHP4.
źródło
Miałem to samo pytanie. Piszę funkcję javascript do analizowania i stringify zapytań. Nie wiem, czy ciąg zapytania ma zduplikowane nazwy lub nazwę w nawiasach, na przykład x [] = 1 i x [] = 2, jest standardem, chociaż niektóre języki obsługują ten format.
Ale uważam, że Chrome i Firefox mają nową klasę o nazwie
URLSeachParams
i obsługują tylko najprostszy format, jakname=value
. Jeśli w ciągu zapytania znajdują się zduplikowane nazwy,get
metodaURLSearchParams
zwraca tylko pierwszą.Więc osobiście, być może najprostszy adres URL bez zduplikowanych nazw jest znacznie bezpieczniejszy na przyszłość.
źródło
URLSearchParams.getAll('x')