Ir para o conteúdo

Callbacks e Tratamento de Erros

Demonstra o uso de callbacks globais e por requisição (onSuccess, onError, onResponse), configuração de tempo limite (timeout), tentativas automáticas (retries), alteração de URL em runtime e diagnóstico de erros.

Código-Fonte: examples/CallbacksAndErrors/CallbacksAndErrors.ino


Visão Geral

Recurso Sintaxe Descrição
Callback de Sucesso .onSuccess([](int code){ ... }) Executado quando a requisição retorna HTTP 2xx.
Callback de Erro .onError([](int code, const char* msg){ ... }) Executado em falhas (code < 200 \|\| code >= 400).
Callback de Resposta .onResponse([](int code){ ... }) Executado no término de qualquer requisição.
Timeout .timeout(3000) / client.setTimeout(5000) Configura o tempo limite de rede em milissegundos.
Max Retry .retry(2) / client.setMaxRetry(3) Número de tentativas automáticas em caso de falha de conexão.
URL em Runtime client.setUrl("https://api.v2.com") Redireciona dinamicamente a base URL do cliente.
Verificação de Estado client.isSuccess(), client.hasError() Métodos booleanos auxiliares para checar o status.

Código Completo

#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

ESP32HTTPClient client("https://jsonplaceholder.typicode.com");

void setup() {
    Serial.begin(115200);

    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nConectado ao WiFi");

    // Callbacks Globais registrados na instância do cliente
    client.onSuccess([](int statusCode) {
        Serial.printf("[Callback Global] Sucesso com HTTP %d\n", statusCode);
    });

    client.onError([](int errorCode, const char* message) {
        Serial.printf("[Callback Global] Erro (%d): %s\n", errorCode, message);
    });

    client.onResponse([](int statusCode) {
        Serial.printf("[Callback Global] Requisição concluída, status: %d\n", statusCode);
    });
}

void loop() {
    // 1. Callbacks por requisição com timeout e retries personalizados
    Serial.println("\n--- [1] Requisição com Callbacks, Timeout e Retry ---");
    int id = 0;

    client.get("/todos/1")
          .timeout(3000)   // 3 segundos de timeout para esta requisição
          .retry(2)        // Até 2 tentativas adicionais em caso de falha
          .onSuccess([](int code) {
              Serial.printf("[Callback Req] Todo obtido com sucesso (HTTP %d)\n", code);
          })
          .onError([](int code, const char* message) {
              Serial.printf("[Callback Req] Falha (%d): %s\n", code, message);
          })
          .getBody("id", &id);

    // 2. Tratamento e inspeção de erros (404 Not Found)
    Serial.println("\n--- [2] Tratando Erro (404 Not Found) ---");
    client.get("/non_existent_endpoint");

    if (client.hasError()) {
        Serial.printf("Erro Detectado: HTTP %d (%s)\n",
                      client.getStatusCode(),
                      client.getErrorMessage().c_str());
    }

    // 3. Alterando a URL do cliente em tempo de execução
    Serial.println("\n--- [3] Alterando URL em Runtime ---");
    client.setUrl("https://httpbin.org");
    client.get("/status/200");

    if (client.isSuccess()) {
        Serial.printf("Redirecionado para %s com sucesso (HTTP %d)\n",
                      client.getBaseUrl(),
                      client.getStatusCode());
    }

    // Restaura a URL para o próximo ciclo do loop
    client.setUrl("https://jsonplaceholder.typicode.com");

    delay(15000);
}

Saída Serial Esperada

Conectado ao WiFi

--- [1] Requisição com Callbacks, Timeout e Retry ---
[Callback Global] Sucesso com HTTP 200
[Callback Req] Todo obtido com sucesso (HTTP 200)
[Callback Global] Requisição concluída, status: 200

--- [2] Tratando Erro (404 Not Found) ---
[Callback Global] Erro (404): Not Found
[Callback Global] Requisição concluída, status: 404
Erro Detectado: HTTP 404 (Not Found)

--- [3] Alterando URL em Runtime ---
[Callback Global] Sucesso com HTTP 200
[Callback Global] Requisição concluída, status: 200
Redirecionado para https://httpbin.org com sucesso (HTTP 200)

Pontos Importantes

  • Os callbacks recebem o código de status HTTP real (200, 404, 500) ou os códigos negativos de rede padrão da biblioteca.
  • O método client.getErrorMessage() fornece uma descrição textual clara e amigável sem códigos numéricos enigmáticos.