Servidor de API REST com JSON no ESP32 - Tutorial Completo
Exemplo WebServerJson - Servidor de API REST
Visão Geral
Este exemplo mostra como criar um servidor de API REST no ESP32 que trata requisições e respostas JSON, ideal para aplicações web modernas e backends de aplicativos móveis.
Recursos
- Endpoints de API REST com tratamento de requisição/resposta JSON
- Processamento de requisições POST com análise de dados JSON
- Endpoints GET para obtenção de dados
- Respostas JSON profissionais com códigos de status HTTP corretos
- Tratamento de erros com mensagens de erro JSON apropriadas
- Suporte a CORS para requisições entre origens
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Instalação da Biblioteca
Siga estas instruções passo a passo:
- Se esta é a sua primeira vez usando o ESP32, consulte o tutorial sobre como configurar o ambiente do ESP32 no Arduino IDE.
- Conecte a placa ESP32 ao seu computador com um cabo USB.
- Abra o Arduino IDE no seu computador.
- Selecione a placa ESP32 apropriada (por exemplo, ESP32) e a porta COM.
- Abra o Library Manager clicando no ícone Library Manager no lado esquerdo do Arduino IDE.
- Pesquise por Web Server for ESP32 e encontre a mWebSockets da DIYables.
- Clique no botão Install para adicionar a biblioteca mWebSockets.

Exemplo de Web Server com Json
- No Arduino IDE, vá em File Examples Web Server for ESP32 WebServerJson para abrir o código do exemplo
Endpoints da API
GET /api/data
Retorna uma mensagem de sucesso com o timestamp em formato JSON.
Resposta:
O valor do timestamp representa os milissegundos desde que o ESP32 iniciou (da função millis()).
POST /api/data
Aceita dados JSON e retorna o valor da chave recebida.
Requisição:
Resposta:
Instruções de Configuração
1. Configuração da Rede
Edite as credenciais de WiFi no arquivo WebServerJson.ino:
2. Faça o Upload do Código e Monitore a Saída
- Conecte o ESP32 ao seu computador
- Selecione a placa e a porta corretas no Arduino IDE
- Faça o upload do sketch WebServerJson.ino
- Abra o Serial Monitor (9600 baud)
- Aguarde a conexão WiFi
- Anote o endereço IP exibido
- Se você não vir o endereço IP no Serial Monitor, pressione o botão de reset na placa ESP32
Uso
Testando com cURL
Substitua your-esp32-ip pelo endereço IP real mostrado no seu Serial Monitor.
Teste da Requisição GET
Saída esperada:
O timestamp mostra os milissegundos desde a inicialização do ESP32.
Teste da Requisição POST com Dados JSON
Saída esperada:
Teste da Requisição POST com Dados Diferentes
Saída esperada:
Teste com JSON Inválido (Resposta de Erro)
Saída esperada:
Teste sem Corpo JSON (Resposta de Erro)
Saída esperada:
Teste com Método Não Suportado (Resposta de Erro)
Saída esperada:
Teste com Endpoint Inexistente (Erro 404)
Saída esperada:
Testando com o Postman
Teste da Requisição GET
- Crie uma nova requisição GET
- Defina a URL como http://your-esp32-ip/api/data
- Envie a requisição
- Confirme que a resposta contém status, message e timestamp
Teste da Requisição POST
- Crie uma nova requisição POST
- Defina a URL como http://your-esp32-ip/api/data
- Adicione o cabeçalho: Content-Type: application/json
- Adicione o corpo JSON: {"key": "test_value"}
- Envie a requisição
- Confirme que a resposta mostra o valor da chave recebida
Testando as Respostas de Erro
Teste o tratamento de erros enviando requisições inválidas, como mostrado no código de exemplo:
Dados JSON Ausentes
Esperado: {"status": "error","message": "No JSON data received"}
Formato JSON Inválido
Esperado: {"status": "error","message": "Invalid JSON"}
Campo Key Ausente
Esperado: A chave assumirá o valor padrão "none", conforme o código de exemplo: doc["key"] | "none"
Método HTTP Não Suportado
Esperado: {"status": "error","message": "Method not allowed"}
Explicação do Código
Configuração das Rotas
Assinatura da Função Tratadora
Todas as funções tratadoras devem seguir esta assinatura:
Detecção do Método e Processamento do JSON
Exemplos de Integração
Frontend em JavaScript
Cliente em Python
Control LED
Get status
Usage
Tratamento de Erros
Códigos de Status HTTP
- 200: Sucesso
- 400: Requisição inválida (JSON inválido, parâmetros ausentes)
- 404: Endpoint não encontrado
- 405: Método não permitido
- 500: Erro interno do servidor
Formato da Resposta de Erro
Com base no código de exemplo real, cada erro retorna mensagens específicas:
Erro de Dados JSON Ausentes
Retornado quando: Uma requisição POST é enviada sem corpo JSON
Erro de Formato JSON Inválido
Retornado quando: Os dados JSON não podem ser analisados (erros de sintaxe)
Erro de Método Não Permitido
Retornado quando: São usados métodos HTTP não suportados (PUT, DELETE, PATCH, etc.)
Erro 404 Not Found
Retornado quando: Endpoints inexistentes são acessados
Personalização
Adicionando Novas Funções Tratadoras
Respostas JSON Baseadas em Templates
O exemplo usa strings de template para manter a formatação JSON consistente:
Solução de Problemas
Problemas Comuns
Problemas de Conexão
Se você não consegue se conectar aos endpoints da API:
- Verifique se o ESP32 está conectado ao WiFi (confira o Serial Monitor)
- Confirme que o seu cliente e o ESP32 estão na mesma rede
- Verifique se o endereço IP está correto
- Confirme que o ESP32 não foi reiniciado (o que mudaria o IP)
Erros de Análise do JSON
Se você receber respostas "Invalid JSON":
- Confirme que o cabeçalho Content-Type está definido como application/json
- Verifique se a sintaxe do JSON é válida
- Confirme que os caracteres especiais estão escapados corretamente
- Verifique se o conteúdo JSON não é grande demais (limite atual: 200 bytes)
Problemas com Requisições POST
Se as requisições POST retornarem "No JSON data received":
- Confirme que você está enviando um corpo JSON com a requisição
- Verifique se o cabeçalho Content-Length está definido corretamente
- Confirme que o método HTTP é realmente POST
- Teste com um JSON simples como {"key": "test"}
Problemas de Memória
Se o ESP32 deixar de responder:
- Monitore o uso de memória - o StaticJsonDocument usa 200 bytes
- Reduza o tamanho do template JSON_RESPONSE, se necessário
- Considere usar o DynamicJsonDocument para dados de tamanho variável
- Verifique vazamentos de memória nas funções tratadoras personalizadas
Dicas de Desempenho
Otimize o Processamento de JSON
Tratamento Eficiente de Respostas
Próximos Passos
- Explore o WebServerQueryStrings.ino para o tratamento de parâmetros de URL
- Experimente o WebServerWithWebSocket.ino para comunicação em tempo real
- Considere a integração com bancos de dados ou serviços na nuvem