2011-07-12 15 views

Respuesta

16

La especificación de sintaxis URI es para URI genéricos. Permite cualquier cosa en el query. No conozco ninguna especificación que realmente especifique los pares clave = valor separados por ampersand. Yo creo que es meramente convencional. Sé que PHP, por ejemplo, ofrece una opción para usar un separador diferente. Pero ahora, todos usan cosas separadas por ampersand cuando quieren pares clave-valor. De vez en cuando, se encuentra con elementos que lo usan solo para una cadena simple, p. http://example.com/?example. Esto es perfectamente válido.

La respuesta básica, sin embargo, es que & es válido en cualquier lugar de la cadena de consulta, incluso al final.


Demistifying la sintaxis RFC, o Por qué & es válida en cualquier parte de la cadena de consulta:

En primer lugar, se han

query  = *(pchar/"/"/"?") 

(Así que una cadena de consulta está hecho de cualquier número de pchar y barras y signos de interrogación literales.)

Volviendo, tiene

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 

Y antes aún

sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Así que un literal & está en sub-delims que está en pchar, por lo que es válido en query

+0

Vale la pena señalar [sección 1.3] (http://tools.ietf.org/html/rfc3986#section-1.3) de esa especificación que reenvía a los usuarios a [rfc2234] (http://tools.ietf.org/html/rfc2234) donde se formaliza ABNF. Sí, la gramática tarda un poco en acostumbrarse, pero no es tan grave una vez que comprenda dónde están las referencias. – aaaaaa

3

Creo que hay una regla no escrita que todos los RFC deben ser casi imposibles de comprender. No eres la primera persona incapaz de analizar la gramática y, en mi humilde opinión, Spray también falló.

No hay nada de malo en un símbolo comercial que se arrastra. Es un carácter legal en el URI utilizado para separar los parámetros. Un ampersand final puede ser inútil, pero no es inválido. Spray debería (nuevamente, solo en mi opinión) simplemente ignorarlo.

Cuestiones relacionadas