Jak przekazać tablicę w ciągu zapytania?

353

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?

Yarin
źródło
Z jakich ram korzystasz? Niektóre frameworki mają metody ułatwiające przekazywanie tablic do kwerend.
klawiaturaP
@ keyboardP- PHP i JavaScript, w zależności od przypadku użycia
Yarin
2
Dlaczego chcesz to zrobić, skoro możesz po prostu:? Myarray = wartość1, wartość2,
wartość3
18
@seroids: co jeśli będzie musiał przekazać przecinki, znaki zapytania, znaki równości i znaki niedrukowalne?
Berry Tsakala

Odpowiedzi:

429

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 :

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(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 :

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

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:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

Szyny:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

Kątowy:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

( 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.

Yarin
źródło
3
Myślę, że powodem, dla którego ta funkcja nie jest udokumentowana w ogólnych źródłach, takich jak Wiki czy W3C, jest to, że nie jest ona ogólnie obsługiwana przez frameworki internetowe. PHP i myślę, że Railsy automatycznie konwertują wiele parametrów zapytania „key []” na tablicę. Inni nie.
Carl G
3
Moduł kwerendowy nodejs używa ?cars=Saab&cars=Audiformularza
SystemParadox
53
W Express (node.js), zarówno ?cars=Saab&cars=Audii ?cars[]=Saab&cars[]=Audisię zamienił tablice. Jednak ?cars=Saabkończy się jako ciąg, ale ?cars[]=Saabjest tablicą z jednym elementem.
Trevor Dixon
5
Czy możesz ustawić klucze przy użyciu tego podejścia? A co z tablicami wielowymiarowymi?
Qwerty
5
Wygląda na to, że ASP.NET MVC nie odczytuje formatu ?cars[]=Saab&cars[]=AudiBrak kwadratowych hamulców lub nawiasy kwadratowe wymagają indeksów /
Mr. Flibble
37

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.

Alex K.
źródło
OK dzięki za wyjaśnienia. Czy widzisz moje poprawione pytanie - czy konieczne jest wykonanie p1 ... pn dla kluczy, czy też mogę po prostu nazwać wiele kluczy „p” i w ten sposób wiedziałbym, że wszystkie należą do tej samej tablicy?
Yarin
1
Możesz użyć tej samej nazwy; stackoverflow.com/questions/2203430/… lub po prostu p = aa, bb, cc, co jest najbardziej oczywistym sposobem, jak skomentował Serodis.
Alex K.
bardzo przydatne z JSON.stringifyi JSON.parse!
charliebrownie
1
Prostym i popularnym formatem reprezentacji jest JSON, w PHP, używając json_encodewtedy rawurlencodei json_decodena drugiej stronie.
Edward,
20

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:

  1. 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_2któ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/3787376

  2. Formaty 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):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

Kod do odbioru strony (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala
źródło
1
Express.js obsługuje również notację w nawiasach kwadratowych, testowaną na 4.13.4.
Steve Kehlet
7

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ę.

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

pole wyboru to moja tablica parametrów tutaj.

Vara
źródło
5

To działa dla mnie:

W linku atrybut ma wartość:

to="/filter/arr?fruits=apple&fruits=banana"

Route poradzi sobie z tym:

path="/filter/:arr"

W przypadku wielu tablic:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

Trasa pozostaje taka sama.

ZRZUT EKRANU

wprowadź opis zdjęcia tutaj

Alia
źródło
2

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.

DCShannon
źródło
2
Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Andrew
@Andrew To nie jest tylko odpowiedź na link. „Oczekiwany format to ten, który zaproponowałeś w swoim pytaniu, z wieloma parametrami o tej samej nazwie”.
DCShannon
2

Używam React i Rails. Zrobiłem:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C
Linielson
źródło
1

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_querymetody, 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.

klawiatura
źródło
1

Chociaż nie ma standardu w części adresu URL, istnieje jeden standard dla JavaScript. Jeśli przekażesz obiekty zawierające tablice URLSearchParamsi wywołasz toString()je, przekształci je ona w listę elementów oddzieloną przecinkami:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123
João Haas
źródło
0

Sprawdź parse_stringfunkcję http://php.net/manual/en/function.parse-str.php

Zwróci wszystkie zmienne z ciągu zapytania, w tym tablice.

Przykład z php.net:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
Dan Murfitt
źródło