Tengo problemas para encontrar información autorizada sobre el comportamiento con los campos duplicados de la cadena de consulta HTTP GET, como
http://example.com/page?field=foo&field=bar
y en particular si la orden se mantiene o no. La mayoría de los lenguajes orientados a la web producen una matriz que contiene foo y bar asociados a un "campo" clave, pero me gustaría saber si existe una declaración autorizada (por ejemplo, en un RFC) sobre este punto. RFC 3986 tiene una sección 3.4. Query
, que se refiere a pares clave = valor, pero no se dice nada sobre cómo interpretar el orden y los campos duplicados, etc. Esto tiene sentido, ya que depende del backend y no está dentro del alcance de ese RFC ...
Aunque existe un estándar de facto, me gustaría ver una fuente autorizada para él, solo por curiosidad.
Respuestas:
No hay especificaciones sobre esto. Puedes hacer lo que quieras.
Los enfoques típicos incluyen: primero dado, último dado, conjunto de todos, cadena de unión con coma de todos.
Supongamos que la solicitud sin procesar es:
Luego, hay varias opciones para lo que
request.query['tag']
debería rendir, según el idioma o el marco:fuente
Puedo confirmar que para PHP (al menos en la versión 4.4.4 y posteriores) funciona así:
resultados en:
Pero
resultados en:
Este comportamiento es el mismo para los datos GET y POST.
fuente
[]
sufijo parece un comportamiento realmente extraño, pero si intentas enviar una matriz como argumento a través de jQuery.ajax()
, las agregará automáticamente de la misma manera. Parece que esto beneficia a los usuarios de PHP.$foo[] = 1
agrega a una matriz. Django (Python) también hace lo mismo.La respuesta de yfeldblum es perfecta.
Solo una nota sobre un quinto comportamiento que noté recientemente: en Windows Phone , abrir una aplicación con una uri con una clave de consulta duplicada dará como resultado NavegaciónFailed con:
El culpable es
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Por lo tanto, el sistema ni siquiera le permitirá manejarlo de la manera que desee, lo prohibirá. Te queda la única solución para elegir tu propio formato (CSV, JSON, XML, ...) y uri-escape-it.
fuente
NavigationFailed
para tal URI. Pero, perdóname, abandoné el desarrollo de Windows (Phone) un mes después de esta publicación y me mudé a macOS (iOS), así que ya no puedo ayudar a rastrear este problema hoy en día.La mayoría (¿todos?) De los marcos no ofrecen garantías, así que suponga que se devolverán en orden aleatorio.
Siempre tome el enfoque más seguro.
Por ejemplo, la interfaz Java HttpServlet: ServletRequest.html # getParameterValues
Incluso el método getParameterMap omite cualquier mención sobre el orden de los parámetros (tampoco se puede confiar en el orden de un iterador java.util.Map).
fuente
Típicamente, valores de parámetros duplicados como
da como resultado un único parámetro queryString que es una matriz:
He visto este comportamiento en ASP, ASP.NET y PHP4.
fuente
Tenía la misma pregunta. Estoy escribiendo la función de JavaScript para analizar y stringificar consultas. No sé si una cadena de consulta tiene nombres duplicados o entre paréntesis, como x [] = 1 & x [] = 2, es estándar, aunque algunos idiomas admiten este formato.
Pero encuentro que Chrome y Firefox tienen una nueva Clase llamada
URLSeachParams
y solo admite el formato más simple comoname=value
. Si hay nombres duplicados en la cadena de consulta, elget
método deURLSearchParams
devolver solo el primero.Entonces, personalmente, quizás una url más simple y sin nombres duplicados es mucho más segura para el futuro.
fuente
URLSearchParams.getAll('x')