# Negociación de contenido

La negociación de contenido se refiere a los mecanismos definidos como parte de HTTP que hacen posible servir diferentes versiones de un documento (o de forma general, representaciones de un recurso) en el mismo URI, de modo que agentes de usuario pueden especificar qué versión se ajuste mejor a sus capacidades. Uno uso clásico de este mecanismo es servir una imagen en formato GIF o PNG, de modo que un navegador que no puede mostrar imágenes PNG (p. ej. MS Internet Explorer 4) será servido en versión GIF.
Un recurso puede estar disponible en varias representaciones diferentes; por ejemplo, puede estar en diferentes idiomas o tipos de medios. Una manera de llegar a la elección más apropiada es dar al usuario una página de índice y dejarlos hacer su selección; aun así, a menudo es posible automatizar la elección basándose en algunos criterios de selección.

## Mecanismos

HTTP funciona con distintos mecanismos de negociación de contenido, incluyendo: conducida por el servidor (o proactiva), conducida por un agente (o reactiva), transparente, y/o combinaciones híbridas de estas.

### Conducida por el servidor

La negociación de contenido conducida por el servidor o proactiva es realizada por algoritmos en el servidor que eligen de entre las posibles representaciones de la variante. Generalmente, este proceso tiene como base criterios de aceptación establecidos por un agente de usuario.
En breve, este proceso inicia cuando un agente de usuario envía una solicitud al servidor y el agente le informa que tipos de medios u otros aspectos del contenido puede entender con puntajes sobre que tan bueno es su entendimiento. De forma más precisa, el agente de usuario provee al servidor de encabezados HTTP que enlistan aspectos aceptables de los recursos y factores cualitativos para estos. Así el servidor se vuelve capaz de proveer al agente de usuario de la versión del recurso que mejor se ajusta a sus necesidades.
Por ejemplo, un navegador podría indicar que le gustaría la información en alemán al poner el Acept-Language así:
Accept-Language: de
En cambio, el navegador puede decir que aunque se prefiere contenido en alemán, en inglés también es aceptable. Esto se establece como:
Accept-Language: de; q=1.0, en; q=0.5
Donde el factor 'q' - calidad- para alemán es más alto que para inglés.
A menudo, se suministran múltiples encabezados HTTP juntos para formato de contenido o, específicamente tipo de medio, idioma y algunos otros aspectos de un recurso. Además del encabezado comúnmente utilizado Acept para Tipo de Medio, el encabezado Acept-Language para negociación de idioma, RFC 7231 también menciona Acept-Charset & Acept-Encodings para codificación de caracteres y de contenido (compresión) respectivamente.
Un ejemplo de una petición más compleja es donde un navegador envía encabezados sobre idioma indicando que se prefiere alemán, pero que inglés es aceptable, como arriba; que con respecto a formatos, HTML (texto/html) se prefiere sobre otros tipos de texto (texto/*), las imágenes GIF (imagen/gif) o JPEG (imagen/jpg) se prefieren sobre otros formatos de imagen (imagen/*), pero que cualquiera otro tipo de medio (*/*) se acepta como último recurso:
Además de aspectos de negociación conducida por el servidor de a cuerdo al tipo de contenido y por el idioma especificados en RFC 7231, hay extensiones que definen otros aspectos de la negociación de contenido, como Memento que describe el uso de un encabezado Acept-Datetime para recuperar versiones de la representación de un recurso en momentos particulares de su existencia y la Negociación de Contenido por Perfil de IETF/W3C que describe el uso de un encabezado Acept- Profile para recuperar representaciones de un recurso que se ajusten a perfiles de datos.
Tanto RFC 7231 como la especificación pertinente más reciente, como Negociación de Contenido por Perfil, fallan al establecer la solución de intercambios en los que distintos encabezados proponen requisitos contradictorios, como en el ejemplo de arriba, escogiendo entre una página HTML en inglés y una imagen tipo GIF en alemán.

### Conducida por el agente

La negociación conducida por el agente o reactiva, es realizada por algoritmos en el agente de usuario, que selecciona de entre posibles variables de la representación. Esta operación es comúnmente realizada con base en una lista provista por el servidor de representaciones y metadatos de estas.
En breve, este proceso inicia cuando un agente de usuario envía una solicitud al servidor y este informa al agente de usuario que representaciones tiene disponible, así como todo metadato que tenga sobre ellas (p. ej., tipo de contenido, calidad, idioma, etc.) El usuario-agente entonces reenvía la solicitud a un URL concreto para la representación escogida. Esta selección puede ser realizada automáticamente por el agente de usuario o este puede presentar al usuario con las opciones, para una selección directa. De forma más precisa, el servidor responde con 300 Opciones Múltiples o 406 No Aceptable (cuándo es conducida por el servidor, los criterios de aceptación del agente de usuario se proporcionan, pero el servidor no puede hacer una selección automáticamente). Desafortunadamente HTTP deja el formato de la lista de representaciones y metadatos, junto con la selección de mecanismos sin especificar.