Artigo original: What is the Correct Content-Type for JSON? Request Header Mime Type Explained

Cada recurso usado na internet possui um tipo de mídia, também conhecido como tipo MIME (sigla em inglês para Multipurpose Internet Mail Extension, ou Extensão de Correio da Internet Multifuncional, em português). Essa informação é necessária para transações entre servidores e clients.

O navegador precisa saber qual o tipo dos recursos de mídia que são enviados a ele e como lidar com esses recursos de maneira correta.

A mesma situação acontece com o servidor. Ele precisa saber o tipo de recursos que são enviados a ele para análise e processamento precisos.

O que é a declaração de Content-Type?

O tipo de mídia de qualquer recurso é declarado na propriedade Content-Type no cabeçalho de uma requisição (no client, quando fazendo a requisição ao servidor) e no cabeçalho de resposta (no servidor, quando enviando uma reposta).

Sem declarar explicitamente o tipo de conteúdo de uma fonte, o client pode tentar automaticamente detectar o tipo, mas o resultado pode não ser o mais preciso. Por isso a importância de o declarar explicitamente.

Tipos de mídia

Os tipos de mídia existentes têm diversas formas. Eles são categorizados em vários grupos:

  • aplicação (application)
  • áudio (audio)
  • fonte (font)
  • exemplo (example)
  • imagem (image)
  • mensagem (message)
  • modelo (model)
  • multiparte (multipart)
  • texto (text)
  • e vídeo (video)

Essas categorias também têm seus tipos. Por exemplo, application/json é um tipo em application e text/html é um tipo em text.

Você pode encontrar uma lista completa dos tipos de mídia na IANA (uma organização que coordena alguns dos elementos principais da internet).

Todos esses vários tipos de dados, como texto, áudio, imagens, HTML e tantos outros são usados por toda a internet.

O navegador precisa saber o tipo de mídia de um recurso

Como mencionei acima, o navegador precisa saber que tipo de conteúdo ele recebe. Aqui temos um exemplo ilustrativo.

O código abaixo é um servidor do Node que serve um arquivo 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("Servidor da web do Node.js na porta 5000 em execução.");

Não se preocupe com as especificidades do código. O que importa aqui é o arquivo index.html que estamos servindo e que Content-Type é text/css.

Aqui está o conteúdo de index.html:

<h1>Homepage</h1>

Logicamente, um documento HTML é diferente de um arquivo CSS. Aqui está o resultado em localhost:5000 quando o servidor é iniciado:

Screenshot-2020-12-08-at-10.12.32

Você também pode confirmar a resposta obtida conferindo os cabeçalhos na aba Rede (ou em inglês, Network) das ferramentas do desenvolvedor.

Aqui vemos o resultado em um navegador do Google Chrome:

Screenshot-2020-12-08-at-10.13.34

O navegador obteve o conteúdo como um tipo CSS. Por isso, tentou tratá-lo como um arquivo CSS.

Observe também que o conhecimento pleno do tipo de conteúdo obtido pelo navegador reduz vulnerabilidades de segurança, pois o navegador conhece os padrões de segurança a serem utilizados para os dados em questão.

Agora que você compreendeu o conceito de tipos MIME e sua importância, vamos tratar do JSON.

O tipo correto de Content-Type para JSON

O JSON precisa ser interpretado corretamente pelo navegador para ser usado adequadamente. text/plain era tipicamente usado para JSON, mas, de acordo com a IANA, o tipo MIME oficial para o JSON é application/json.

Isso significa que, quando você estiver enviando JSON para o servidor ou recebendo JSON do servidor, deve sempre declarar o Content-Type do cabeçalho como application/json, pois esse é o padrão que tanto o client quanto o servidor entendem.

Conclusão

Como vimos acima, o servidor (assim como o navegador) precisa saber o tipo de dados enviados a ele, por exemplo, em uma solicitação de POST. Esse é o motivo pelo qual forms com arquivos geralmente contêm o atributo enctype com o valor de multipart/form-data.

Sem codificar a solicitação dessa maneira, a solicitação de POST não dará certo. Além disso, quando o servidor sabe o tipo de dados que foi enviado para ele, ele saberá como fazer o parsing dos dados codificados.

Neste artigo, examinamos o que são os tipos MIME e sua finalidade. Vimos também qual é o tipo oficial de conteúdo para JSON. Espero que você agora saiba da importância de declarar os tipos de recursos quando utilizá-los na internet.