Czy istnieje standardowy sposób przekazywania tablicy przez ciąg zapytania?
Dla jasności mam ciąg zapytania z wieloma wartościami, z których jedna byłaby wartością tablicy. Chcę, aby wartość ciągu zapytania była traktowana jako tablica - nie chcę, aby tablica została rozbita, aby była nierozróżnialna od innych zmiennych ciągu zapytania.
Ponadto, zgodnie z tą odpowiedzią na post , autor sugeruje, że obsługa ciągu zapytań dla tablic nie jest zdefiniowana. Czy to jest dokładne?
EDYTOWAĆ:
W oparciu o odpowiedź @ Alexa nie ma standardowego sposobu na zrobienie tego, więc moje śledzenie jest zatem łatwym sposobem na rozpoznanie, że parametr, który czytam, jest tablicą zarówno w PHP, jak i JavaScript ?
Czy dopuszczalne byłoby nazywanie wielu parametrów tą samą nazwą i w ten sposób wiedziałbym, że należą one do tablicy? Przykład:
?myarray=value1&myarray=value2&myarray=value3...
Czy byłaby to zła praktyka?
Odpowiedzi:
Oto, co wymyśliłem:
Przesyłanie pól formularza o wielu wartościach, tj. Przesyłanie tablic za pomocą zmiennych GET / POST, można wykonać na kilka różnych sposobów, ponieważ standard nie jest koniecznie określony.
Trzy możliwe sposoby wysyłania pól lub tablic o wielu wartościach to:
?cars[]=Saab&cars[]=Audi
(Najlepszy sposób - PHP wczytuje to do tablicy)?cars=Saab&cars=Audi
(Zły sposób - PHP zarejestruje tylko ostatnią wartość)?cars=Saab,Audi
(Nie próbowałem tego)Przykłady formularzy
W formularzu pola o wielu wartościach mogą przybrać formę pola wyboru ustawionego na wiele :
(UWAGA: W tym przypadku byłoby ważne nazwać formant select
some_name[]
, aby wynikowe zmienne żądań zostały zarejestrowane przez PHP jako tablica)... lub jako wiele ukrytych pól o tej samej nazwie :
UWAGA: Używanie
field[]
wielu wartości jest naprawdę słabo udokumentowane. Nie widzę żadnej wzmianki o tym w sekcji o kluczach wielowartościowych w ciągu zapytania - Wikipedia , ani w dokumentach W3C zajmujących się wejściami wielokrotnego wyboru.AKTUALIZACJA
Jak zauważyli komentatorzy, jest to bardzo specyficzne dla ram. Kilka przykładów:
Ciąg zapytania:
Szyny:
Kątowy:
( Dyskusja kątowa )
Zobacz komentarze do przykładów w node.js , Wordpress , ASP.net
Utrzymywanie porządku: Jeszcze jedną rzeczą do rozważenia jest to, że jeśli musisz zachować porządek swoich przedmiotów (tj. Tablica jako lista uporządkowana), naprawdę masz tylko jedną opcję, która przekazuje ograniczoną listę wartości i jawnie konwertuje ją na tablica sama.
źródło
?cars=Saab&cars=Audi
formularza?cars=Saab&cars=Audi
i?cars[]=Saab&cars[]=Audi
się zamienił tablice. Jednak?cars=Saab
kończy się jako ciąg, ale?cars[]=Saab
jest tablicą z jednym elementem.?cars[]=Saab&cars[]=Audi
Brak kwadratowych hamulców lub nawiasy kwadratowe wymagają indeksów /Ciąg zapytania przenosi dane tekstowe, więc nie ma innej opcji, jak tylko rozbić tablicę, zakodować ją poprawnie i przekazać w wybranym przez Ciebie formacie reprezentacyjnym:
p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}
a następnie zdekoduj go w kodzie serwera.
źródło
JSON.stringify
iJSON.parse
!json_encode
wtedyrawurlencode
ijson_decode
na drugiej stronie.Nie sądzę, żeby istniał standard.
Każde środowisko sieciowe zapewnia własny „standard” dla takich rzeczy. Poza tym adres URL jest zwykle za krótki na wszystko (limit 256 bajtów w niektórych przeglądarkach). Oczywiście dłuższe tablice / dane można wysyłać za pomocą żądań POST.
Istnieją jednak pewne metody:
Istnieje sposób PHP, który używa nawiasów kwadratowych (
[
,]
) w zapytaniach URL. Na przykład zapytanie, o?array_name[]=item&array_name[]=item_2
którym mówi się, że działa, mimo że jest słabo udokumentowane, a PHP automatycznie przekształca je w tablicę. Źródło: https://stackoverflow.com/a/9547490/3787376Formaty wymiany danych obiektowych (np. JSON - oficjalna strona internetowa , dokumentacja PHP ) mogą być również używane, jeśli mają metody konwersji zmiennych na i z łańcuchów, tak jak robi to JSON.
Również koder URL (dostępny dla większości języków programowania) jest wymagany do żądania HTTP, aby poprawnie zakodować dane ciągu.
Chociaż „metoda nawiasów kwadratowych” jest prosta i działa, jest ograniczona do PHP i tablic.
Jeśli wymagane są inne typy zmiennych, takie jak klasy lub przekazywanie zmiennych w ciągach zapytań w języku innym niż PHP, zalecana jest metoda JSON.
Przykład w PHP metody JSON (metoda 2):
Kod do odbioru strony (PHP):
źródło
Myślę, że byłoby to pomocne dla kogoś, kto szuka przekazania tablicy w ciągu zapytania do serwletu. Przetestowałem poniżej ciągu zapytania i byłem w stanie uzyskać wartości tablic za pomocą req.getgetParameterValues (); metoda. Poniżej znajduje się ciąg zapytania, który przeszedłem przez przeglądarkę.
pole wyboru to moja tablica parametrów tutaj.
źródło
To działa dla mnie:
W linku atrybut ma wartość:
Route poradzi sobie z tym:
W przypadku wielu tablic:
Trasa pozostaje taka sama.
ZRZUT EKRANU
źródło
W swoim pytaniu wspominasz o PHP i JavaScript, ale nie w tagach. Doszedłem do tego pytania z zamiarem przekazania tablicy do akcji MVC.Net.
Znalazłem odpowiedź na moje pytanie tutaj : oczekiwany format to ten, który zaproponowałeś w swoim pytaniu, z wieloma parametrami o tej samej nazwie.
źródło
Używam React i Rails. Zrobiłem:
js
źródło
Możesz użyć http_build_query, aby wygenerować kwerendę zakodowaną w adresie URL z tablicy w PHP. Chociaż powstałe kwerendowanie zostanie rozszerzone, możesz wybrać unikalny separator, który chcesz jako parametr
http_build_query
metody, więc jeśli chodzi o dekodowanie, możesz sprawdzić, który separator został użyty. Jeśli byłby to jedyny wybrany przez ciebie, to byłby to querystring tablicy, w przeciwnym razie byłoby to normalne querystring.źródło
Chociaż nie ma standardu w części adresu URL, istnieje jeden standard dla JavaScript. Jeśli przekażesz obiekty zawierające tablice
URLSearchParams
i wywołasztoString()
je, przekształci je ona w listę elementów oddzieloną przecinkami:źródło
Sprawdź
parse_string
funkcję http://php.net/manual/en/function.parse-str.phpZwróci wszystkie zmienne z ciągu zapytania, w tym tablice.
Przykład z php.net:
źródło