Domanda

Una stringa di query HTTP GET è una sequenza ordinata di coppie chiave / valore:

?spam=eggs&spam=ham&foo=bar

È, con una certa semantica, equivalente al seguente dizionario:

{'spam': ['eggs', 'ham'], 'foo': bar}

Questo sembra funzionare bene per le proprietà booleane della pagina richiesta:

?expand=1&expand=2&highlight=7&highlight=9
{'expand': [1, 2], 'highlight': [7, 9]}

Se si desidera interrompere l'espansione dell'elemento con id 2, estrarlo dal valore expand e ricodificare nuovamente la stringa della query. Tuttavia, se hai una proprietà più modale (con 3+ scelte), vuoi davvero rappresentare una struttura come questa:

{'highlight_mode': {7: 'blue', 9: 'yellow'}}

Dove i valori delle chiavi ID corrispondenti fanno parte di un elenco noto. Qual è il modo migliore per codificarlo in una stringa di query? Sto pensando di usare una sequenza di due tuple in questo modo:

?highlight_mode=(7,blue)&highlight_mode=(9,yellow)

Modifica: Sarebbe anche bello conoscere tutti i nomi associati alle convenzioni. So che potrebbe non essercene, ma è bello poter parlare di qualcosa di specifico usando un nome anziché degli esempi. Grazie!

È stato utile?

Soluzione

Il solito modo è farlo in questo modo:

highlight_mode[7]=blue&highlight_mode[9]=yellow

AFAIR, alcune lingue sul lato server in realtà supportano questo immediatamente e produrranno un bel dizionario per questi valori.

Altri suggerimenti

Ho anche visto persone codificare JSON nel dizionario nidificato, quindi codificarlo ulteriormente con BASE64 (o qualcosa di simile), quindi passare l'intero pasticcio risultante come un singolo parametro della stringa di query.

Abbastanza brutto.

D'altra parte, se riesci a cavartela usando POST, JSON è davvero un ottimo modo per trasmettere questo tipo di informazioni avanti e indietro.

In molti framework Web è codificato in modo diverso da quello che dici.

{'foo': [1], 'bar': [2, 3], 'fred': 4}

sarebbe:

?foo[]=1&bar[]=2&bar[]=3&fred=4

Il motivo per cui le risposte dell'array dovrebbero essere diverse dalle risposte semplici è che il layer di decodifica può distinguere automaticamente il caso foo meno comune (array che ha solo un singolo elemento) dal caso fred estremamente comune (elemento singolo).

Questa notazione può essere estrapolata in:

?highlight_mode[7]=blue&highlight_mode[9]=yellow

quando hai un hash, non solo un array.

Penso che questo sia praticamente ciò che fanno Rails e la maggior parte dei framework che copiano da Rails.

Gli array vuoti, gli hash vuoti e la mancanza di valore scalare sembrano identici in questa codifica, ma non c'è molto che puoi fare al riguardo.

Questo [] sembra causare solo alcune guerre di fiamma. Alcuni lo considerano inutile, perché il browser, il livello di trasporto e il codificatore della stringa di query non si preoccupano. L'unica cosa che interessa è il decodificatore automatico della stringa di query. Sostengo il modo Rails di usare []. L'alternativa sarebbe avere metodi separati per estrarre uno scalare ed estrarre un array da querystring, poiché non esiste un modo automatico per dire quando il programma vuole [1] quando vuole 4.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top