Come passare un array all'interno di una stringa di query?


353

Esiste un modo standard per passare un array attraverso una stringa di query?

Per essere chiari, ho una stringa di query con più valori, uno dei quali sarebbe un valore di matrice. Voglio che il valore della stringa di query venga trattato come un array. Non voglio che l'array venga esploso in modo che sia indistinguibile dalle altre variabili della stringa di query.

Inoltre, secondo questa risposta post , l'autore suggerisce che il supporto della stringa di query per gli array non è definito. È preciso?

MODIFICARE:

Sulla base della risposta di @ Alex, non esiste un modo standard per farlo, quindi il mio follow-up è quindi qual è un modo semplice per riconoscere che il parametro che sto leggendo è un array sia in PHP che in Javascript ?

Sarebbe accettabile nominare più parametri con lo stesso nome e in questo modo saprei che appartengono a un array? Esempio:

?myarray=value1&myarray=value2&myarray=value3...

O sarebbe una cattiva pratica?


Quale framework stai usando? Alcuni framework hanno metodi per aiutare a passare le matrici alle stringhe di query.
tastieraP

@ keyboardP- PHP e Javascript, a seconda del caso d'uso
Yarin,

2
Perché dovresti farlo quando potresti semplicemente fare:? Myarray = value1, value2,
value3

18
@seroids: cosa succede se deve passare virgole, punti interrogativi, segni di uguale e caratteri non stampabili?
Berry Tsakala,

Risposte:


429

Ecco cosa ho capito:

L'invio di campi modulo multi-valore, ovvero l'invio di matrici tramite VAR GET / POST, può essere effettuato in diversi modi, poiché uno standard non è necessariamente definito.

Tre possibili modi per inviare campi o matrici multi-valore sarebbero:

  • ?cars[]=Saab&cars[]=Audi (Modo migliore- PHP legge questo in un array)
  • ?cars=Saab&cars=Audi (Cattiva strada - PHP registrerà solo l'ultimo valore)
  • ?cars=Saab,Audi (Non l'ho provato)

Esempi di moduli

In un modulo, i campi multivalore potrebbero assumere la forma di una casella di selezione impostata su multipli :

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

(NOTA: in questo caso, sarebbe importante nominare il controllo di selezione some_name[], in modo che le richieste risultanti vengano registrate come array da PHP)

... o come più campi nascosti con lo stesso nome :

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

NOTA: l' utilizzo field[]per più valori è davvero scarsamente documentato. Non ne vedo alcun riferimento nella sezione sulle chiavi a più valori nella stringa di query - Wikipedia , o nei documenti del W3C che trattano input multi-selezione.


AGGIORNARE

Come hanno sottolineato i commentatori, questo è molto specifico per il framework. Qualche esempio:

Stringa della domanda:

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

Rails:

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

Angolare:

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

( Discussione angolare )

Vedi commenti per esempi in node.js , Wordpress , ASP.net


Mantenimento dell'ordine: un'altra cosa da considerare è che se è necessario mantenere l' ordine dei propri articoli (ad es. Array come elenco ordinato), si ha davvero solo un'opzione, che passa un elenco di valori delimitato e lo converte esplicitamente in un array tu stesso.


3
Penso che il motivo per cui questa funzionalità non sia documentata in fonti generali come Wiki o W3C sia che in genere non è supportato dai framework web. PHP e penso che Rails converta automaticamente più parametri di query "chiave []" in un array. Altri no.
Carl G,

3
Il modulo querystring nodejs utilizza il ?cars=Saab&cars=Audimodulo
SystemParadox,

53
In Espresso (node.js), sia ?cars=Saab&cars=Audie ?cars[]=Saab&cars[]=Audiarrivare trasformato in array. Tuttavia, ?cars=Saabfinisce come una stringa, ma ?cars[]=Saabè un array con un singolo elemento.
Trevor Dixon,

5
Puoi impostare le chiavi usando questo approccio? E le matrici multidimensionali?
Qwerty,

5
ASP.NET MVC non sembra leggere il formato ?cars[]=Saab&cars[]=AudiNon ci sono né parentesi quadre o le parentesi quadre hanno bisogno di indici /
Mr. Flibble

37

Una stringa di query trasporta dati testuali in modo che non ci sia altra opzione che esplodere l'array, codificarlo correttamente e passarlo in un formato rappresentativo a scelta:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

e poi decodificalo nel tuo codice lato server.


OK grazie per il chiarimento. Riesci a vedere la mia domanda rivista? È necessario fare p1 ... pn, per le chiavi, o posso semplicemente nominare più chiavi 'p', e in questo modo saprei che appartengono tutte allo stesso array?
Yarin,

1
Puoi usare lo stesso nome; stackoverflow.com/questions/2203430/… o semplicemente p = aa, bb, cc che è il modo più ovvio come ha commentato Serodis.
Alex K.

molto utile con JSON.stringifye JSON.parse!
charliebrownie,

1
Un formato rappresentativo semplice e comune è JSON, in PHP usando json_encodequindi rawurlencodee json_decodenell'altra pagina.
Edward,

20

Non credo ci sia uno standard.
Ogni ambiente web fornisce il proprio "standard" per tali cose. Inoltre, l'URL di solito è troppo breve per qualsiasi cosa (limite di 256 byte su alcuni browser). Ovviamente matrici / dati più lunghi possono essere inviati con richieste POST.

Tuttavia, ci sono alcuni metodi:

  1. C'è un modo PHP, che utilizza le parentesi quadre ( [, ]) nelle query URL. Ad esempio, ?array_name[]=item&array_name[]=item_2si dice che una query come questa funzioni, nonostante sia scarsamente documentata, con PHP che la converte automaticamente in un array. Fonte: https://stackoverflow.com/a/9547490/3787376

  2. I formati di scambio dati di oggetti (ad es. JSON - sito Web ufficiale , documentazione PHP ) possono anche essere usati se hanno metodi di conversione di variabili da e verso stringhe come JSON.
    Inoltre, è necessario un codificatore url (disponibile per la maggior parte dei linguaggi di programmazione) per le richieste get HTTP per codificare correttamente i dati della stringa.

Sebbene il "metodo delle parentesi quadre" sia semplice e funzioni, è limitato a PHP e array.
Se sono richiesti altri tipi di variabili come classi o variabili passanti all'interno di stringhe di query in una lingua diversa da PHP, si consiglia il metodo JSON.

Esempio in PHP del metodo JSON (metodo 2):

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

Codice per la pagina di ricezione (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.

1
Express.js supporta anche la notazione parentesi quadra, testata su 4.13.4.
Steve Kehlet

7

Penso che sarebbe utile per qualcuno che sta cercando di passare l'array in una stringa di query a un servlet. Ho testato sotto la stringa di query e sono stato in grado di ottenere i valori dell'array utilizzando req.getgetParameterValues ​​(); metodo. Di seguito è la stringa di query che ho passato attraverso il browser.

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

la casella di controllo è il mio array di parametri qui.


5

Questo funziona per me:

Nel collegamento, attribuire ha valore:

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

Il percorso può gestire questo:

path="/filter/:arr"

Per array multipli:

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

Il percorso rimane lo stesso.

IMMAGINE DELLO SCHERMO

inserisci qui la descrizione dell'immagine


2

Citi PHP e Javascript nella tua domanda, ma non nei tag. Ho raggiunto questa domanda con l'intenzione di passare un array a un'azione MVC.Net.

Ho trovato la risposta alla mia domanda qui : il formato previsto è quello che hai proposto nella tua domanda, con più parametri con lo stesso nome.


2
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Andrew,

@Andrew Non è un link solo risposta. "Il formato previsto è quello che hai proposto nella tua domanda, con più parametri con lo stesso nome."
DCShannon

2

Uso React e Rails. L'ho fatto:

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

1

Puoi utilizzare http_build_query per generare una querystring con codifica URL da un array in PHP. Mentre la querystring risultante verrà espansa, puoi decidere su un separatore univoco che desideri come parametro del http_build_querymetodo, quindi quando si tratta di decodifica, puoi controllare quale separatore è stato usato. Se fosse l'unico che hai scelto, allora sarebbe la matrice di querystring altrimenti sarebbero le normali querystring.


1

Sebbene non vi sia uno standard nella parte URL, esiste uno standard per JavaScript. Se si passano oggetti contenenti matrici a URLSearchParamse lo si chiama toString(), lo trasformerà in un elenco di elementi separato da virgole:

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

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

Controlla la parse_stringfunzione http://php.net/manual/en/function.parse-str.php

Restituirà tutte le variabili da una stringa di query, compresi gli array.

Esempio da 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

?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.