Tratamento de SOAP Faults¶
Quando um serviço web SOAP não consegue processar uma requisição, ele retorna uma resposta XML contendo um elemento <Fault> (ou <soap:Fault>), geralmente acompanhado de status HTTP 500.
O ESP32-HTTP-Client detecta automaticamente SOAP Faults nos formatos SOAP 1.1 e SOAP 1.2, extrai os campos em streaming e dispara o callback .onFault(...).
1. Inspecionando a struct SoapFault¶
Vincule uma instância de SoapFault via .getFault(&fault):
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"
ESP32HTTPClient client("https://api.example.com");
void setup() {
Serial.begin(115200);
SoapFault fault;
client.soap("/orders")
.soapAction("http://example.com/SubmitOrder")
.body("<m:SubmitOrder><m:OrderId>-1</m:OrderId></m:SubmitOrder>")
.getFault(&fault);
if (fault.matched) {
Serial.println("\n--- Falha SOAP Detectada ---");
Serial.printf("Código da Falha : %s\n", fault.faultCode.c_str());
Serial.printf("Mensagem : %s\n", fault.faultString.c_str());
Serial.printf("Ator / Nó : %s\n", fault.faultActor.c_str());
Serial.printf("Detalhes : %s\n", fault.detail.c_str());
} else if (client.isSuccess()) {
Serial.println("Pedido enviado com sucesso!");
}
}
void loop() {}
2. Usando o Callback .onFault(...)¶
client.soap("/payments")
.version(SOAP_1_2)
.action("http://example.com/Charge")
.body("<m:Charge><m:Amount>100</m:Amount></m:Charge>")
.onFault([](const SoapFault& fault) {
Serial.printf("Falha SOAP no Pagamento: [%s] %s\n",
fault.faultCode.c_str(),
fault.faultString.c_str());
})
.onError([](int statusCode, const char* message) {
Serial.printf("Erro HTTP %d: %s\n", statusCode, message);
})
.onSuccess([](int statusCode) {
Serial.println("Pagamento processado com sucesso!");
});
3. Mapeamento entre SOAP 1.1 e SOAP 1.2¶
Campo em SoapFault |
Elemento SOAP 1.1 | Elemento SOAP 1.2 |
|---|---|---|
faultCode |
<faultcode> |
<Code><Value> |
faultString |
<faultstring> |
<Reason><Text> |
faultActor |
<faultactor> |
<Node> ou <Role> |
detail |
<detail> |
<Detail> |
matched |
true se <Fault> encontrado |
true se <Fault> encontrado |