Antecedentes (pregunta más abajo)
He estado buscando en Google esto de ida y vuelta leyendo RFC y preguntas SO tratando de descifrar esto, pero todavía no tengo Jack.
Así que supongo que votamos por la "mejor" respuesta y eso es todo, ¿o?
Básicamente se reduce a esto.
3.4. Componente de consulta
El componente de consulta es una cadena de información que el recurso debe interpretar.
query = *uric
Dentro de un componente de consulta, los caracteres ";", "/", "?", ":", "@", "&", "=", "+", "," Y "$" están reservados.
Lo primero que me desconcierta es que * uric se define así
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Sin embargo, esto se aclara algo con párrafos como
La clase de sintaxis "reservada" anterior se refiere a aquellos caracteres que están permitidos dentro de un URI, pero que pueden no estar permitidos dentro de un componente particular de la sintaxis URI genérica; se utilizan como delimitadores de los componentes descritos en la Sección 3.
Los caracteres del conjunto "reservado" no están reservados en todos los contextos. El conjunto de caracteres realmente reservados dentro de cualquier componente de URI dado lo define ese componente. En general, un carácter se reserva si la semántica del URI cambia si el carácter se reemplaza con su codificación US-ASCII de escape.
Este último extracto se siente algo al revés, pero establece claramente que el conjunto de caracteres reservados depende del contexto. Sin embargo, 3.4 establece que todos los caracteres reservados están reservados dentro de un componente de consulta, sin embargo, lo único que cambiaría la semántica aquí es escapar del signo de interrogación (?) Ya que los URI no definen el concepto de una cadena de consulta.
En este punto, he renunciado por completo a los RFC, pero encontré el RFC 1738 particularmente interesante.
Una URL HTTP tiene la forma:
http://<host>:<port>/<path>?<searchpart>
Dentro de los componentes <path> y <searchpart>, "/", ";", "?" están reservados. El carácter "/" se puede utilizar dentro de HTTP para designar una estructura jerárquica.
Interpreto esto al menos con respecto a las URL HTTP que RFC 1738 reemplaza a RFC 2396. Debido a que la consulta URI no tiene noción de una cadena de consulta, la interpretación de reservado no me permite definir cadenas de consulta como estoy acostumbrado haciendo por ahora.
Pregunta
Todo esto comenzó cuando quise pasar una lista de números junto con la solicitud de otro recurso. No pensé mucho en eso, y simplemente lo pasé como valores separados por comas. Para mi sorpresa, la coma se escapó. La consulta page.html?q=1,2,3
codificada se convirtió en page.html?q=1%2C2%2C3
funciona, pero es fea y no lo esperaba. Fue entonces cuando comencé a revisar los RFC.
Mi primera pregunta es simplemente, ¿es realmente necesario codificar las comas?
Mi respuesta, según RFC 2396: sí, según RFC 1738: no
Más tarde encontré publicaciones relacionadas con el paso de listas entre solicitudes. Donde el enfoque csv estaba posicionado como malo. Esto apareció en su lugar (no había visto esto antes).
page.html?q=1;q=2;q=3
Mi segunda pregunta, ¿es esta una URL válida?
Mi respuesta, según RFC 2396: no, según RFC 1738: no (; está reservado)
No tengo ningún problema con pasar csv siempre que sean números, pero sí, corre el riesgo de tener que codificar y decodificar valores de un lado a otro si de repente se necesita la coma para otra cosa. De todos modos probé la cadena de consulta de punto y coma con ASP.NET y el resultado no fue el que esperaba.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
No veo cómo esto difiere mucho de un enfoque csv, ya que cuando pregunto por "a" obtengo una cadena con comas. ASP.NET ciertamente no es una implementación de referencia, pero aún no me ha defraudado.
Pero lo más importante, mi tercera pregunta, ¿dónde está la especificación para esto? y ¿qué harías o no harías?