Modo corretto per passare più valori per lo stesso nome di parametro nella richiesta GET


194

Sto esaminando qual è il modo corretto per passare più valori per lo stesso nome di parametro in una richiesta GET.

Ho visto URL come questo:

http://server/action?id=a&id=b

E ho visto URL come questo:

http://server/action?id=a,b

La mia comprensione è che il primo è corretto, ma non riesco a trovare alcun riferimento per questo. Ho dato un'occhiata alle specifiche http, ma non sono riuscito a vedere nulla su come creare la parte "query" di un URL.

Non voglio una risposta che dice "nessuno dei due va bene" - se sto costruendo un servizio web, voglio sapere quale di questi metodi è standard in modo che le persone che usano il mio servizio web sappiano come passare più parametri con lo stesso nome.

Quindi, qualcuno può indicarmi una fonte di riferimento ufficiale per confermare quale opzione è corretta?

Risposte:


166

In effetti, non esiste uno standard definito. Per supportare tali informazioni, dai un'occhiata a Wikipedia, nel capitolo Query String . C'è il seguente commento:

Sebbene non esista uno standard definitivo, la maggior parte dei framework Web consente di associare più valori a un singolo campo. [3] [4]

Inoltre, quando si osserva RFC 3986 , nella sezione 3.4 Query , non esiste una definizione per parametri con più valori.

La maggior parte delle applicazioni utilizzano la prima opzione che avete dimostrato: http://server/action?id=a&id=b. Per supportare tali informazioni, dai un'occhiata a questo link Stackoverflow e questo link MSDN relativo alle applicazioni ASP.NET, che utilizzano lo stesso standard per parametri con più valori.

Tuttavia, poiché stai sviluppando le API, ti suggerisco di fare ciò che è più semplice per te, poiché il chiamante dell'API non avrà molti problemi a creare la stringa di query.


In assenza di qualsiasi informazione contraria, suppongo che tu abbia ragione: se RFC3986 non specifica uno standard, allora non ce n'è uno. Grazie Eduardo.
stripybadger,

19
A suggerirebbe di utilizzare id=a&id=bcome AND booleano e id=a,bcome OR booleano.
Alex Skrypnyk,

17
FWIW PHP non supporta la lettura di argomenti simili ?id=5&id=3. PHP leggerebbe solo un valore per id qui. Se ricordo bene, dovrebbe apparire così perché funzioni con PHP:?id[]=5&id[]=3
Cosa hai provato il

3
+1 persince 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,bipotizza che il coma ,sia un delimitatore valido. Ma i valori dei tuoi parametri potrebbero contenere a ,. Quindi il client deve uscire ,dai valori dei parametri della query. Ma potresti decidere che ;è meglio. Significa che il client e il server devono condividere il delimitatore ufficiale per la tua API. id=a&id=bnon ha questo problema, anche se allunga gli URL
Ronan Quillevere,

5

Suggerirei di esaminare come i browser gestiscono i moduli per impostazione predefinita. Ad esempio, dai un'occhiata all'elemento del modulo <select multiple>e al modo in cui gestisce più valori di questo esempio su 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>

Per l'uso di PHP:

<select name="cars[]" multiple>

Esempio live dall'alto su w3schools.com

Dall'alto, se fai clic su "saab, opel" e fai clic su Invia, genererà un risultato di cars = saab & cars = opel . Quindi, a seconda del server back-end, le auto dei parametri dovrebbero presentarsi come un array che è possibile elaborare ulteriormente.

Spero che questo aiuti chiunque cerchi un modo più "standard" di gestire questo problema.

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.