HTTP #4 – El content-type

Protocolo HTTP

Hasta ahora nos hemos enfocado sobre todo en URLs, pero ¿qué significa cuando introduzco una URL en el navegador? Normalmente significa que queremos obtener o ver algún recurso.

No hemos sido muy específicos sobre el tipo de recurso que queremos obtener. Hay miles de tipos de recursos en la web (imágenes, páginas HTML, documentos XML, vídeo, audio, documentos de word, etc.) Para que un host sirva un adecuadamente un recurso y para que un navegador lo muestre apropiadamente, ambas partes deben ser específicas sobre el tipo de recurso. ¿Es el recurso una imagen, un vídeo? No nos gustaría que el navegador interpretara una imagen PNG como texto.

Cuando el host responde a una HTTP request devuelve un recurso y además especifica el content type del recurso. Para especificar los content types, HTTP utiliza los MIME (Multipurpose Internet Mail Extensions). Se trata de etiquetar el contenido de tal manera que el navegador sepa qué contenido contiene la HTTP response.

Por ejemplo, cuando un navegador hace una petición para mostrar una página web, el host lanza una HTTP response con código HTML y etiquetada como “text/html“. Cuando responde a la petición de una imagen, el host etiquetará el recurso con el content type de “image/jpeg” en el caso de la imagen tenga ese formato.

Se podría pensar que un navegador sabe el content type de un recurso en base a la extensión del fichero. Por ejemplo, si el navegador pide “rana.jpg“, se debería tratar como una imagen jpg ya que es la extensión del fichero. Sin embargo, para la mayoría de los navegadores, la extensión es lo último que se utiliza para saber el content type del recurso.

Por ejemplo, si Internet Explorer no localiza el content type establecido por el host buscará en los primeros 200 bytes de la response intentando averiguar el content type. Si no encuentra nada que determine cuál es el content type recurrirá entonces a la extensión.

Esta es una de las razones por la cual la etiqueta content type es importante.

Aunque solemos pensar que HTTP se utiliza para ver páginas web, resulta que la especificación de HTTP lo describe como un protocolo flexible, genérico para el envío de información.  Parte del trabajo de mover información es asegurarse de que las partes involucradas saben cómo interpretar la información, y aquí es donde entran en juego los media types.

Sin embargo, los media types no son solo para los servidores o hosts. Los navegadores o clientes pueden jugar un role en qué media type devuelve un host realizando una especie de negociación en el content type.

Un recurso identificado por una sola URL puede tener múltiple representaciones. Cojamos, por ejemplo, la famosa receta de brocoli de la venimos hablando. La receta puede estar en diferentes idiomas (castellano, inglés y francés). Incluso la receta puede tener varios formatos (HTML, PDF, texto plano). El el mismo recurso y la misma receta pero en diferentes representaciones.

¿Con qué representación del recurso debe responder el servidor? La respuesta la da la negociación entre el host y el cliente. Cuando un cliente realiza una HTTP request puede especificar los media types que aceptará. Los media types no son solo para que el host etiquete los recursos que lanza, sino que también sirve a los clientes especificar el media type que quieren recibir.

Un navegador realiza una petición a http://recetas.com diciendo que aceptará una representación en alemán (el idioma establecido en las opciones del navegador es el alemán).  El servidor que no encontrará la versión en alemán puede devolver una página en castellano (establecida en el servidor por defecto) pero probablemente sería una decepción para el usuario alemán. Aún así, el servidor devolvería la página en castellano ya que lo que se realiza es una negociación. No se trata de “si no está en alemán no me des la response” si no de “si está en alemán preferiría en alemán“.

HTTP #4 – El content-type

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s