Una cadena de consulta es una parte de un localizador uniforme de recursos (URL) que asigna valores a parámetros específicos. Generalmente, una cadena de consulta incluye campos añadidos a una URL base por un navegador web u otra aplicación cliente, por ejemplo, como parte de un documento HTML, para definir la apariencia de una página o para navegar a posiciones específicas en contenido multimedia.

title=Query_string&action=editUn servidor web puede gestionar una solicitud del Protocolo de Transferencia de Hipertexto (HTTP) leyendo un archivo de su sistema de archivos según la ruta URL o procesando la solicitud mediante una lógica específica para el tipo de recurso. En los casos en que se invoca una lógica especial, la cadena de consulta estará disponible para su procesamiento, junto con la ruta URL.
Estructura
Una URL típica que contiene una cadena de consulta es la siguiente:
https://example.com/over/there?name=ferret
Cuando un servidor recibe una solicitud para dicha página, puede ejecutar un programa, pasando la cadena de consulta, que en este caso es name=ferret, sin cambios al programa. El signo de interrogación se usa como separador y no forma parte de la cadena de consulta. [ 1 ] [ 2 ]
Los frameworks web pueden proporcionar métodos para analizar múltiples parámetros en la cadena de consulta, separados por algún delimitador . [ 3 ] En la URL de ejemplo a continuación, los múltiples parámetros de consulta están separados por el signo de ampersand , " &":
https://example.com/path/to/page?name=ferret&color=purple
La estructura exacta de la cadena de consulta no está estandarizada. Los métodos utilizados para analizar la cadena de consulta pueden variar entre sitios web.
Un enlace en una página web puede tener una URL que contiene una cadena de consulta. HTML define tres formas en que un agente de usuario puede generar la cadena de consulta:
- un formulario HTML a través del elemento
<form>...</form> - un mapa de imagen del lado del servidor a través del
ismapatributo en el elemento con una construcción<img><imgismap> - una búsqueda indexada a través del elemento ahora obsoleto
<isindex>
Formularios web
Uno de los usos originales era contener el contenido de un formulario HTML , también conocido como formulario web. En particular, cuando se envía un formulario que contiene los campos field1, field2, field3el contenido de los campos se codifica como una cadena de consulta de la siguiente manera:
field1=value1&field2=value2&field3=value3...
- La cadena de consulta se compone de una serie de pares campo-valor.
- Dentro de cada par, el nombre del campo y el valor están separados por un signo igual , "
=". - La serie de pares está separada por el signo de ampersand , "
&" ( el W3C ya no recomienda el uso de punto y coma " " , véase más abajo).;
Aunque no existe un estándar definitivo, la mayoría de los frameworks web permiten asociar múltiples valores a un solo campo (por ejemplo, field1=value1&field1=value2&field2=value3). [ 4 ] [ 5 ]
Para cada campo del formulario, la cadena de consulta contiene un par . Los formularios web pueden incluir campos que no son visibles para el usuario; estos campos se incluyen en la cadena de consulta cuando se envía el formulario.field=value
Esta convención es una recomendación del W3C . [ 3 ] En las recomendaciones de 1999, el W3C recomendó que todos los servidores web admitieran separadores de punto y coma además de los separadores de ampersand [ 6 ] para permitir cadenas de consulta application/x-www-form-urlencoded en URL dentro de documentos HTML sin tener que escapar entidades de ampersand. Desde 2014, el W3C recomienda usar solo ampersand como separador de consulta. [ 7 ]
El contenido del formulario solo se codifica en la cadena de consulta de la URL cuando el método de envío del formulario es GET . La misma codificación se utiliza por defecto cuando el método de envío es POST , pero el resultado se envía como el cuerpo de la solicitud HTTP en lugar de incluirse en una URL modificada. [ 8 ]
Búsqueda indexada
Antes de que se añadieran formularios a HTML, los navegadores representaban el elemento – como un control de entrada de texto de una sola línea. El texto introducido en este control se enviaba al servidor como una cadena de consulta añadida a una solicitud GET para la URL base u otra URL especificada por el atributo. [ 9 ] Esto tenía como objetivo permitir que los servidores web utilizaran el texto proporcionado como criterios de consulta para que pudieran devolver una lista de páginas coincidentes. [ 10 ]<isindex>action
Cuando se envía el texto introducido en el control de búsqueda indexada, se codifica como una cadena de consulta de la siguiente manera:
argument1+argument2+argument3...
- La cadena de consulta se compone de una serie de argumentos que se obtienen al analizar el texto en palabras, separando los espacios.
- La serie está separada por el signo más , '
+'.
Aunque el elemento está obsoleto y la mayoría de los navegadores ya no lo admiten ni lo renderizan, aún existen algunos vestigios de la búsqueda indexada. Por ejemplo, este es el origen del manejo especial del signo más , ' ', dentro de la codificación porcentual de URL del navegador (que hoy, con la obsolescencia de la búsqueda indexada, es prácticamente redundante con ). Además, algunos servidores web que admiten CGI (por ejemplo, Apache ) procesarán la cadena de consulta en argumentos de línea de comandos si no contiene un signo igual , ' ' (según la sección 4.4 de CGI 1.1). Algunos scripts CGI todavía dependen de y utilizan este comportamiento histórico para URL incrustadas en HTML.<isindex>+%20=
Codificación URL
Algunos caracteres no pueden formar parte de una URL (por ejemplo, el espacio) y otros tienen un significado especial en una URL: por ejemplo, el carácter# puede usarse para especificar aún más una subsección (o fragmento ) de un documento. En los formularios HTML, el carácter =se usa para separar un nombre de un valor. La sintaxis genérica de URI usa la codificación URL para abordar este problema, mientras que los formularios HTML hacen algunas sustituciones adicionales en lugar de aplicar la codificación porcentual para todos esos caracteres. El ESPACIO se codifica como ' +' o " %20". [ 11 ]
HTML 5 especifica la siguiente transformación para enviar formularios HTML con el método "GET" a un servidor web. A continuación se presenta un breve resumen del algoritmo:
- Los caracteres que no se pueden convertir al conjunto de caracteres correcto se reemplazan con referencias numéricas de caracteres HTML [ 12 ].
- El ESPACIO se codifica como '
+' o '%20' - Las letras (
A–Zya–z), los números (0–9) y los caracteres '~','-','.' y '_' se dejan como están. +está codificado por %2B- Todos los demás caracteres se codifican como una representación
%HHhexadecimal , y cualquier carácter que no sea ASCII se codifica primero como UTF-8 (u otra codificación especificada).
El octeto correspondiente a la tilde (" ~") está permitido en las cadenas de consulta según RFC3986, pero debe codificarse en porcentaje en los formularios HTML como " %7E".
La codificación de ESPACIO como ' +' y la selección de caracteres "tal cual" distingue esta codificación de RFC 3986.
Ejemplo
Si un formulario está incrustado en una página HTML de la siguiente manera:
< form action = "/cgi-bin/test.cgi" method = "get" > < input type = "text" name = "first" /> < input type = "text" name = " second" /> < input type = "submit" / > </form>y el usuario inserta las cadenas "este es un campo" y "¿estaba claro (ya)?" en los dos campos de texto y presiona el botón de enviar, el programa test.cgi(el programa especificado por el actionatributo del formelemento en el ejemplo anterior) recibirá la siguiente cadena de consulta: .first=this+is+a+field&second=was+it+clear+%28already%29%3F
Si el formulario es procesado en el servidor por un script CGI , el script normalmente puede recibir la cadena de consulta como una variable de entorno llamada .QUERY_STRING
Seguimiento
Un programa que recibe una cadena de consulta puede ignorar parte o la totalidad de la misma. Si la URL solicitada corresponde a un archivo y no a un programa, se ignora toda la cadena de consulta. Sin embargo, independientemente de si se utiliza o no la cadena de consulta, la URL completa, incluida esta, se almacena en los archivos de registro del servidor .
Estos hechos permiten utilizar cadenas de consulta para rastrear a los usuarios de forma similar a como lo hacen las cookies HTTP . Para que esto funcione, cada vez que el usuario descarga una página, se debe elegir un identificador único y agregarlo como cadena de consulta a las URL de todos los enlaces que contiene la página. Tan pronto como el usuario sigue uno de estos enlaces, se solicita la URL correspondiente al servidor. De esta manera, la descarga de esta página queda vinculada con la anterior.
Por ejemplo, cuando se solicita una página web que contiene lo siguiente:
<a href="foo.html"> ¡ Mira mi página ! </a> <a href="bar.html"> La mía es mejor </a>Se elige una cadena única, como por e0a72cb2a2c7ejemplo, y la página se modifica de la siguiente manera:
<a href="foo.html?e0a72cb2a2c7"> ¡ Mira mi página ! </a> <a href="bar.html?e0a72cb2a2c7"> La mía es mejor </a>La adición de la cadena de consulta no cambia la forma en que se muestra la página al usuario. Cuando el usuario sigue, por ejemplo, el primer enlace, el navegador solicita la página foo.html?e0a72cb2a2c7al servidor, que ignora lo que sigue ?y envía la página foo.htmlcomo se espera, agregando también la cadena de consulta a sus enlaces.
De esta forma, cualquier solicitud de página posterior de este usuario llevará la misma cadena de consulta e0a72cb2a2c7, lo que permite establecer que todas estas páginas han sido vistas por el mismo usuario. Las cadenas de consulta se utilizan a menudo junto con las balizas web .
Las principales diferencias entre las cadenas de consulta utilizadas para el seguimiento y las cookies HTTP son las siguientes:
- Las cadenas de consulta forman parte de la URL y, por lo tanto, se incluyen si el usuario guarda o envía la URL a otro usuario; las cookies se pueden mantener entre sesiones de navegación, pero no se guardan ni se envían con la URL.
- Si el usuario accede al mismo servidor web por dos (o más) rutas independientes, se le asignarán dos cadenas de consulta diferentes, aunque las cookies almacenadas sean las mismas.
- El usuario puede desactivar las cookies, en cuyo caso su uso para el seguimiento no funciona. Sin embargo, el uso de cadenas de consulta para el seguimiento debería funcionar en todas las situaciones.
- Las diferentes cadenas de consulta que se pasan en las distintas visitas a la página harán que las páginas nunca se sirvan desde la caché del navegador (o del proxy, si está presente), lo que aumentará la carga en el servidor web y ralentizará la experiencia del usuario.
Problemas de compatibilidad
Según la especificación HTTP :
En la práctica se encuentran varias limitaciones ad hoc en la longitud de la línea de solicitud. Se RECOMIENDA que todos los remitentes y receptores HTTP admitan, como mínimo, longitudes de línea de solicitud de 8000 octetos. [ 13 ]
Si la URL es demasiado larga, el servidor web falla con el código de estado HTTP 414 Request-URI Too Long .
La solución habitual para estos problemas consiste en usar POST en lugar de GET y almacenar los parámetros en el cuerpo de la solicitud. Los límites de longitud de los cuerpos de las solicitudes suelen ser mucho mayores que los de la longitud de la URL. Por ejemplo, el límite de tamaño para POST, por defecto, es de 2 MB en IIS 4.0 y de 128 KB en IIS 5.0. El límite se puede configurar en Apache2 mediante la directiva, que especifica el número de bytes permitidos en el cuerpo de una solicitud, LimitRequestBodydesde 0 (ilimitado) hasta 2147483647 (2 GB). [ 14 ]
Véase también
Referencias
- ↑ T. Berners-Lee; R. Fielding; L. Masinter (enero de 2005). "RFC 3986" . "Componentes de sintaxis" (sección 3).
- ↑ T. Berners-Lee; R. Fielding; L. Masinter (enero de 2005). "RFC 3986" . "Consulta" (sección 3.4).
- 1 2 Formularios en documentos HTML . W3.org. Consultado el 8 de septiembre de 2013.
- ↑ "ServletRequest (Java EE 6)" . docs.oracle.com . 10-02-2011 . Consultado el 08-09-2013 .
- ↑ "uri – Posición autorizada de claves de consulta HTTP GET duplicadas" . Stack Overflow . 09/06/2013 . Consultado el 08/09/2013 .
- ↑ Notas sobre rendimiento, implementación y diseño . W3.org. Consultado el 8 de septiembre de 2013.
- ↑ "4.10 Formularios — HTML5" .
- ↑HTML5.2, recomendación del W3C, 14 de diciembre de 2017
- ↑ " < isindex > " . HTML (Lenguaje de marcado de hipertexto) . Archivado del original el 19-10-2017 . Recuperado el 21-11-2015 .
- ↑ "HTML/Elements/isindex" . Wiki del W3C . Archivado del original el 22 de junio de 2021. Consultado el 20 de marzo de 2020 .
- ↑ "Referencia de codificación de URL HTML" . W3Schools . Consultado el 1 de mayo de 2013 .
- ↑ El algoritmo de codificación application/x-www-form-urlencoded , HTML5.2, recomendación del W3C, 14 de diciembre de 2017
- ↑ Sintaxis y enrutamiento de mensajes HTTP/1.1 . ietf.org. Consultado el 31 de julio de 2014.
- ↑ core – Servidor HTTP Apache . Httpd.apache.org. Consultado el 8 de septiembre de 2013.
- URL
- Cadenas de caracteres (informática)