Background (domanda più in basso)
Ho cercato su Google questo avanti e indietro leggendo RFC e domande SO cercando di risolverlo, ma ancora non ho ottenuto jack.
Quindi immagino che votiamo solo per la "migliore" risposta e basta, o?
Fondamentalmente si riduce a questo.
3.4. Componente di query
Il componente query è una stringa di informazioni che deve essere interpretata dalla risorsa.
query = *uric
All'interno di un componente di query, i caratteri ";", "/", "?", ":", "@", "&", "=", "+", "," E "$" sono riservati.
La prima cosa che mi lascia perplesso è che * uric è definito così
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Ciò è tuttavia in qualche modo chiarito da paragrafi come
La classe di sintassi "riservata" sopra si riferisce a quei caratteri che sono consentiti all'interno di un URI, ma che potrebbero non essere consentiti all'interno di un particolare componente della sintassi URI generica; sono usati come delimitatori dei componenti descritti nella Sezione 3.
I caratteri nel set "riservato" non sono riservati in tutti i contesti. L'insieme di caratteri effettivamente riservato all'interno di un dato componente URI è definito da quel componente. In generale, un carattere è riservato se la semantica dell'URI cambia se il carattere viene sostituito con la sua codifica US-ASCII con escape.
Quest'ultimo estratto sembra un po 'arretrato, ma afferma chiaramente che il set di caratteri riservato dipende dal contesto. Tuttavia 3.4 afferma che tutti i caratteri riservati sono riservati all'interno di un componente di query, tuttavia, l'unica cosa che cambierebbe la semantica qui è sfuggire al punto interrogativo (?) Poiché gli URI non definiscono il concetto di stringa di query.
A questo punto ho rinunciato completamente alle RFC ma ho trovato la RFC 1738 particolarmente interessante.
Un URL HTTP assume la forma:
http://<host>:<port>/<path>?<searchpart>
All'interno dei componenti <path> e <searchpart>, "/", ";", "?" sono riservati. Il carattere "/" può essere utilizzato all'interno di HTTP per designare una struttura gerarchica.
Lo interpreto almeno per quanto riguarda gli URL HTTP che RFC 1738 sostituisce RFC 2396. Poiché la query URI non ha la nozione di stringa di query, anche l'interpretazione di riservato non mi consente di definire stringhe di query come sono abituato facendo ormai.
Domanda
Tutto è iniziato quando ho voluto passare un elenco di numeri insieme alla richiesta di un'altra risorsa. Non ci ho pensato molto e l'ho semplicemente passato come valori separati da virgole. Con mia grande sorpresa però la virgola è stata sfuggita. La query page.html?q=1,2,3
codificata trasformata in page.html?q=1%2C2%2C3
esso funziona, ma è brutta e non se l'aspettava. È stato allora che ho iniziato a passare attraverso le RFC.
La mia prima domanda è semplicemente: la codifica delle virgole è davvero necessaria?
La mia risposta, secondo RFC 2396: sì, secondo RFC 1738: no
Successivamente ho trovato post correlati riguardanti il passaggio di liste tra le richieste. Dove l'approccio CSV era considerato pessimo. Questo invece è apparso (non l'ho mai visto prima).
page.html?q=1;q=2;q=3
La mia seconda domanda, è un URL valido?
La mia risposta, secondo RFC 2396: no, secondo RFC 1738: no (; è riservato)
Non ho problemi con il passaggio di csv fintanto che sono numeri, ma sì, corri il rischio di dover codificare e decodificare i valori avanti e indietro se la virgola è improvvisamente necessaria per qualcos'altro. Comunque ho provato la stringa di query punto e virgola con ASP.NET e il risultato non era quello che mi aspettavo.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Non riesco a vedere come questo differisca notevolmente da un approccio csv poiché quando chiedo "a" ottengo una stringa con virgole. ASP.NET non è certamente un'implementazione di riferimento ma non mi ha ancora deluso.
Ma la cosa più importante - la mia terza domanda - dove sono le specifiche per questo? e cosa faresti o per quella materia non faresti?