Original article: What is the Correct Content-Type for JSON? Request Header Mime Type Explained

Cada recurso utilizado en Internet tiene un tipo de medio, también conocido como tipo MIME, que significa Extensión multipropósito de correo de Internet (por sus siglas en inglés Multipurpose Internet Mail Exension). Esta información es necesaria para las transacciones entre el servidor y el cliente.

El navegador necesita conocer el tipo de medio de los recursos que se le envían para que pueda manejarlos correctamente.

Lo mismo ocurre con el servidor. Necesita saber el tipo de recursos que se le envían para un análisis y procesamiento precisos.

¿Dónde se declara el tipo de contenido (Content-Type)?

El tipo de medio de cualquier recurso se declara en la propiedad Content-Type del encabezado de la solicitud (en el cliente, al realizar una solicitud al servidor) o en el encabezado de respuesta (en el servidor, al enviar una respuesta).

Sin declarar explícitamente el tipo de contenido de un recurso, el cliente puede intentar detectar automáticamente el tipo, pero el resultado puede no ser exacto. Por eso es importante declararlo explícitamente.

Tipos de medios

Los tipos de medios existen en varias formas. Se clasifican en varios grupos:

  • application (aplicación)
  • audio
  • font (fuente)
  • example (ejemplo)
  • image (imagen)
  • message (mensaje)
  • model (modelo)
  • multipart
  • text (texto)
  • y video

Estas categorías también tienen sus tipos. Por ejemplo, application/jsones un tipo dentro de applicationy text/htmles un tipo dentro de text.

Puedes encontrar una lista completa de tipos de medios en los tipos de medios de la IANA (un organismo que coordina algunos de los elementos clave en Internet).

Todos estos tipos cubren varios tipos de datos como texto, audio, imágenes, HTML y muchos más tipos que se utilizan en Internet.

El navegador necesita saber el tipo de medio de un recurso

Como mencioné anteriormente, el navegador necesita saber qué tipo de contenido recibe. He aquí un ejemplo para ilustrar eso.

El siguiente código es un servidor Node que sirve un archivo HTML:

const http = require("http");
const fs = require("fs");
const path = require("path");

const server = http.createServer(function (req, res) {
	const filePath = path.join(__dirname, "index.html");
	var stat = fs.statSync(filePath);

	res.writeHead(200, {
		"Content-Type": "text/css",
		"Content-Length": stat.size,
	});

	const readStream = fs.createReadStream(filePath);
	readStream.pipe(res);
});

server.listen(5000);

console.log("Node.js web server at port 5000 is running..");

No te preocupes por los detalles del código. Todo lo que debe preocuparte es el archivo index.htm que estamos sirviendo y que el Content-Typees text/css.

Aquí está el contenido del index.html:

<h1>Homepage</h1>

Por supuesto, un documento HTML es diferente de un archivo CSS. Aquí está el resultado de localhost:5000cuando el servidor está iniciado:

Screenshot-2020-12-08-at-10.12.32

También puedes confirmar la respuesta obtenida al verificar los encabezados en la pestaña de red de DevTools.

Aquí está el resultado en un navegador Chrome:

Screenshot-2020-12-08-at-10.13.34

El navegador obtuvo el contenido como un tipo CSS, por lo tanto, intentó tratarlo como CSS.

Además, ten en cuenta que el conocimiento completo del tipo de contenido obtenido por el navegador también reduce las vulnerabilidades de seguridad, ya que el navegador conoce los estándares de seguridad que debe implementar para esos datos.

Ahora que comprendes el concepto de tipos MIME y su importancia, pasemos a JSON.

El tipo de contenido correcto para JSON

JSON tiene que ser interpretado correctamente por el navegador para ser utilizado adecuadamente. text/plainse usaba normalmente para JSON, pero según IANA, el tipo MIME oficial para JSON es application/json.

Esto significa que cuando envías JSON al servidor o recibes JSON del servidor, siempre debe estar declarado el Content-Type del encabezado, como application/json por ser el estándar que entienden el cliente y el servidor.

Conclusión

Como se indicó anteriormente, el servidor (al igual que el navegador) necesita saber el tipo de datos que se le envía, por ejemplo, en una solicitud POST. Esa es la razón por la que los forms con archivos suelen contener el atributo enctype con un valor de multipart/form-data.

Sin codificar la solicitud de esta manera, la solicitud POST no funcionará. Además, una vez que el servidor conoce el tipo de datos que ha obtenido, sabe cómo analizar los datos codificados.

En este artículo, analizamos qué son los tipos MIME y su propósito. Además, analizamos el tipo de contenido oficial para JSON. Espero que ahora sepas por qué es importante declarar los tipos de recursos cuando se usan en Internet.