Hintergrund (Frage weiter unten)
Ich habe dies hin und her gegoogelt und RFCs und SO-Fragen gelesen, um dies zu knacken, aber ich habe immer noch keinen Jack.
Ich denke, wir stimmen einfach für die "beste" Antwort und das wars, oder?
Im Grunde läuft es darauf hinaus.
3.4. Abfragekomponente
Die Abfragekomponente ist eine Informationsfolge, die von der Ressource interpretiert werden soll.
query = *uric
Innerhalb einer Abfragekomponente sind die Zeichen ";", "/", "?", ":", "@", "&", "=", "+", "," Und "$" Reserviert.
Das erste, was mich verwirrt, ist, dass * uric so definiert ist
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Dies wird jedoch durch Absätze wie z
Die obige "reservierte" Syntaxklasse bezieht sich auf diejenigen Zeichen, die in einem URI zulässig sind, in einer bestimmten Komponente der generischen URI-Syntax jedoch möglicherweise nicht zulässig sind. Sie werden als Begrenzer der in Abschnitt 3 beschriebenen Komponenten verwendet.
Zeichen im "reservierten" Satz sind nicht in allen Kontexten reserviert. Der tatsächlich in einer bestimmten URI-Komponente reservierte Zeichensatz wird von dieser Komponente definiert. Im Allgemeinen ist ein Zeichen reserviert, wenn sich die Semantik des URI ändert, wenn das Zeichen durch seine maskierte US-ASCII-Codierung ersetzt wird.
Dieser letzte Auszug fühlt sich etwas rückwärts an, aber er besagt eindeutig, dass der reservierte Zeichensatz vom Kontext abhängt. 3.4 besagt jedoch, dass alle reservierten Zeichen innerhalb einer Abfragekomponente reserviert sind. Das einzige, was die Semantik hier ändern würde, ist das Entkommen des Fragezeichens (?), Da URIs das Konzept einer Abfragezeichenfolge nicht definieren.
Zu diesem Zeitpunkt habe ich die RFCs vollständig aufgegeben, fand RFC 1738 jedoch besonders interessant.
Eine HTTP-URL hat folgende Form:
http://<host>:<port>/<path>?<searchpart>
Innerhalb der Komponenten <path> und <searchpart> "/", ";", "?" sind reserviert. Das Zeichen "/" kann in HTTP verwendet werden, um eine hierarchische Struktur zu bestimmen.
Ich interpretiere dies zumindest in Bezug auf HTTP-URLs, die RFC 1738 anstelle von RFC 2396 verwendet. Da die URI-Abfrage keine Vorstellung von einer Abfragezeichenfolge hat, kann ich bei der Interpretation von reservierten auch nicht wirklich Abfragezeichenfolgen definieren, wie ich es gewohnt bin jetzt tun.
Frage
Dies alles begann, als ich eine Liste von Nummern zusammen mit der Anfrage einer anderen Ressource übergeben wollte. Ich habe nicht viel darüber nachgedacht und es nur als durch Kommas getrennte Werte übergeben. Zu meiner Überraschung wurde das Komma jedoch entfernt. Die page.html?q=1,2,3
verschlüsselte Abfrage page.html?q=1%2C2%2C3
funktioniert, ist aber hässlich und hat es nicht erwartet. Zu diesem Zeitpunkt habe ich angefangen, RFCs durchzugehen.
Meine erste Frage ist einfach: Ist das Codieren von Kommas wirklich notwendig?
Meine Antwort laut RFC 2396: Ja, gemäß RFC 1738: Nein
Später fand ich verwandte Beiträge zum Weitergeben von Listen zwischen Anfragen. Wo der CSV-Ansatz als schlecht eingestuft wurde. Dies zeigte sich stattdessen (habe dies noch nicht gesehen).
page.html?q=1;q=2;q=3
Meine zweite Frage, ist das eine gültige URL?
Meine Antwort gemäß RFC 2396: Nein, gemäß RFC 1738: Nein (; ist reserviert)
Ich habe keine Probleme mit der Übergabe von CSV, solange es sich um Zahlen handelt, aber ja, Sie laufen Gefahr, Werte hin und her codieren und decodieren zu müssen, wenn das Komma plötzlich für etwas anderes benötigt wird. Wie auch immer, ich habe die Semikolon-Abfragezeichenfolge mit ASP.NET ausprobiert und das Ergebnis war nicht das, was ich erwartet hatte.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Ich sehe nicht, wie sehr sich dies von einem CSV-Ansatz unterscheidet, da ich bei der Frage nach "a" eine Zeichenfolge mit Kommas erhalte. ASP.NET ist sicherlich keine Referenzimplementierung, hat mich aber noch nicht enttäuscht.
Aber am wichtigsten - meine dritte Frage - wo ist die Spezifikation dafür? und was würdest du tun oder was nicht?