Gestione errori: codici HTTP, retry e integrazione robusta

Codici di stato HTTP, risposte di errore e logica di retry dell'API PSB: come costruire un'integrazione robusta.

Ogni integrazione con un'API prima o poi incontrerà degli errori. Un'interruzione di rete, un server irraggiungibile, un documento con formato errato: fa parte del lavoro. L'API PSB comunica gli errori tramite codici di stato HTTP standard e risposte JSON strutturate. Inoltre, il PSB dispone di un meccanismo di retry integrato che gestisce automaticamente gli errori temporanei durante la consegna dei documenti.

In questo articolo scoprirai quali codici di stato restituisce il PSB, come interpretare le risposte di errore, quando puoi riprovare in sicurezza e come funziona il meccanismo di retry automatico del PSB.

Codici di stato HTTP

L'API PSB utilizza codici di stato HTTP standard per indicare il risultato di una richiesta. I codici di stato si dividono in due categorie: errori del client (4xx) che devi correggere tu stesso, ed errori del server (5xx) che puoi riprovare.

Risposta di successo
CodiceSignificatoSpiegazione200OKLa richiesta è stata elaborata con successo201CreatedNuovo oggetto creato (ad esempio un hook, subscriber o documento/risorsa)202AcceptedRichiesta accettata per elaborazione asincrona/in coda; controlla lo stato successivamente204No ContentRichiesta riuscita senza corpo di risposta (ad esempio con DELETE o un aggiornamento senza corpo)
Errori del client (4xx): non riprovare

Con un errore 4xx il problema è nella richiesta stessa. Reinviare con gli stessi dati produrrà lo stesso risultato. Correggi la causa prima di riprovare.

CodiceSignificatoQuandoAzione400Bad RequestErrore di validazione o errore di sintassi nel documentoControlla il corpo della richiesta. La risposta JSON contiene i dettagli su cosa è andato storto401UnauthorizedNessun token inviato, oppure il token è scaduto o non è validoRichiedi un nuovo Bearer token dall'Identity Server403ForbiddenIl token è valido, ma l'azione non è consentita. Il caso più comune: stai usando un partyId a cui il tuo account non ha accesso. Altre cause: bearer token scaduto, subscription key non valida, o un endpoint non disponibile per il tuo livello di autorizzazioneVerifica di usare il partyId corretto e che l'utente che ha ottenuto il bearer token abbia accesso a quel partyId. In caso di dubbio: ottieni un nuovo token tramite l'Identity Server404Not FoundL'endpoint o la risorsa richiesta non esiste (ad esempio un Document ID, hook o PartyID sconosciuto). Durante l'invio, questo si verifica anche con la combinazione "No valid delivery options. PartyId '...' not found in Peppol" (tra l'altro con VerstuurInvoice): il PartyId fornito non è presente (per questo tipo di documento) su Peppol/SMPVerifica l'URL, il Document ID e il partyId. In caso di "PartyId not found in Peppol": esegui prima una lookup tramite queryRecipientParty o lookup.peppol.org sull'ID fornito, poi controlla eventualmente schemi correlati (ad esempio BE 0208 rispetto a 9925/BE:VAT, stesso numero base) -- consiglia una modifica dell'EndpointID solo in caso di risultato di lookup confermato. Nessun risultato su alcun ID candidato: il destinatario non è raggiungibile con questi identificatori; il cliente deve richiedere la registrazione o un altro ID di consegna al destinatario405Method Not AllowedIl metodo HTTP utilizzato non è supportato su questo endpointConsulta la documentazione API per il metodo corretto (GET/POST/PUT/DELETE)409ConflictIl documento è già stato elaborato (idempotenza)Nessuna azione necessaria: il documento è stato ricevuto con successo in precedenza. Vedi idempotenza413Content Too LargeIl file supera la dimensione massimaRiduci il documento o gli allegati. Limite IDR: 15 MB415Unsupported Media TypeL'header Content-Type manca o è erratoUsa il content-type corretto, ad esempio application/json dove richiesto422Unprocessable EntityLa richiesta è tecnicamente corretta, ma il contenuto non può essere elaborato (ad esempio UBL non valido, un errore di validazione Peppol o una business rule violata)Verifica la struttura del documento e le business rule; la risposta JSON di solito contiene dettagli400 (agenzie duplicate)Schema identificatore duplicatoDue o più identificatori con lo stesso codice schema/agenzia in una singola chiamata queryRecipientParty. Messaggio di errore: EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.' (dove {code} è il codice agenzia senza zero iniziale, es. schema 0208208).Fornire un solo identificatore per schema per chiamata. Più candidati nello stesso schema: effettuare chiamate separate.

API403 Access forbidden: il messaggio di errore letterale [API403] Access forbidden. Please check PartyId authorization and make sure the Subscription-Key is valid può comparire, tra l'altro, in caso di invio Peppol fallito da Business Central ("delivery failed"), ma la causa è generica del PSB, non specifica di BC. Ordine di diagnosi:

  1. Verifica l'autorizzazione PartyId: stai usando il partyId corretto e il collegamento dell'account ha diritti su quella party?
  2. Rinnova il Bearer token se è scaduto o non valido.
  3. Verifica la Subscription-Key solo se quell'header è ancora obbligatorio (legacy/Collabrr/API31) -- non come primo passo predefinito.

Nota: la menzione di "Subscription-Key" nel messaggio di errore non significa automaticamente che la chiave debba essere rinnovata. L'autorizzazione PartyId e un problema di collegamento lato piattaforma sono cause altrettanto comuni. Se la consegna continua a fallire dopo una verifica valida di token e partyId, effettua l'escalation al supporto eConnect invece di ruotare ripetutamente la Subscription-Key.

Validazione dell'envelope SBDH (API400.USRMS1 / API400.USRMS2): questi codici di errore indicano una discrepanza tra l'envelope Peppol (SBDH) e il documento di fattura elettronica stesso. Con USRMS1, il mittente o il destinatario nell'envelope non corrisponde agli identificatori nell'XML della fattura. Con USRMS2, il PSB non riesce a trovare un mittente riconoscibile nel documento. Verifica che l'EndpointID e il PartyIdentification nel tuo UBL corrispondano ai valori forniti durante l'invio. Il PSB rifiuta il documento a livello AS4 e restituisce l'errore all'Access Point mittente.

Rate limiting (429): riprovabile

Un'eccezione alla regola "solo il 5xx è riprovabile": 429 Too Many Requests indica rate limiting ed è riprovabile. Attendi e rispetta l'header Retry-After prima di reinviare la richiesta.

CodiceSignificatoQuandoAzione429Too Many RequestsRate limiting: stai inviando troppe richieste in un intervallo di tempoAttendi e rispetta l'header Retry-After, poi riprova
Errori del server (5xx): riprovare

Un errore 5xx indica un problema temporaneo lato server. La richiesta stessa potrebbe essere corretta. Insieme al 429, questi sono gli unici codici di stato per cui ha senso riprovare.

CodiceSignificatoQuandoAzione500Internal Server ErrorErrore inatteso del serverRiprovare con exponential backoff502Bad GatewayRisposta non valida da un servizio a monte; solitamente temporaneoRiprovare con exponential backoff503Service UnavailableIl PSB è temporaneamente non disponibile (manutenzione, sovraccarico)Riprovare con exponential backoff504Gateway TimeoutUn servizio a monte non risponde in tempoRiprovare con exponential backoff

Nota: l'endpoint di invio accetta un massimo di 24 MB per richiesta, incluso l'overhead HTTP. I payload che superano questo limite vengono rifiutati dal web server con un HTTP 500 anziché un 413, perché il rifiuto avviene prima che il livello applicativo esegua la validazione. Tienilo presente con gli allegati codificati in base64: aggiungono circa il 33% alla dimensione del file.

API500UH durante i deployment: il codice di errore API500UH (Unhandled error) può verificarsi quando il PSB esegue un aggiornamento interno del servizio (deployment di Service Fabric). In molti casi il documento è già stato consegnato con successo al destinatario, ma il passaggio di conferma fallisce a causa della migrazione. Il meccanismo di retry del PSB tenta automaticamente di completare i passaggi rimanenti. Se ricevi un API500UH, verifica tramite gli eventi di stato se il documento è stato consegnato prima di reinviarlo.

Lettura delle risposte di errore

Con un errore 4xx la risposta contiene un corpo JSON che descrive il problema. Queste informazioni ti aiutano a identificare rapidamente la causa.

{
  "error": "Validation failed",
  "message": "The supplied document is not valid UBL 2.1",
  "details": [
    "cbc:InvoiceTypeCode is missing"
  ]
}

Con un errore 5xx la risposta non è sempre strutturata. Basa la tua logica di retry sul codice di stato HTTP, non sul contenuto del corpo.

Strategia di retry per la tua integrazione

Non tutti gli errori meritano un retry. La regola generale è semplice: solo i codici di stato 5xx e i timeout di rete meritano un retry. Con errori 4xx devi modificare la richiesta prima di inviarla nuovamente.

Exponential backoff

La strategia di retry raccomandata è l'exponential backoff: inizia con un tempo di attesa breve e raddoppialo ad ogni tentativo successivo.

TentativoTempo di attesa11 secondo22 secondi34 secondi48 secondi516 secondi632 secondi7+60 secondi (massimo)

Suggerimento: aggiungi una piccola variazione casuale (jitter) al tempo di attesa. Se più client riprovano simultaneamente dopo un'interruzione, il jitter evita che colpiscano tutti il server nello stesso momento.

Retry sicuri con idempotenza

Combina sempre la tua logica di retry con l'header X-EConnect-DocumentId. Includendo lo stesso documentId ad ogni tentativo, il PSB garantisce che un documento non venga mai elaborato due volte. Se il PSB riceve un documentId già elaborato, restituisce un 409 Conflict come conferma.

Consulta Idempotenza: prevenire invii duplicati per la spiegazione completa e gli esempi di codice.

Albero decisionale
Meccanismo di retry automatico del PSB

Oltre alla logica di retry che implementi tu stesso, il PSB ha un proprio meccanismo di retry per la consegna dei documenti. Se il PSB tenta di consegnare una fattura o un ordine al destinatario e quest'ultimo restituisce un errore 5xx, il PSB riprende automaticamente la consegna.

Consegna documenti (fatture e ordini)

Il PSB effettua fino a 8 tentativi di retry distribuiti su circa 35 ore. Ad ogni tentativo il PSB pubblica un evento per consentirti di monitorare il progresso:

EventoSignificatoInvoiceSentRetryÈ stato avviato un nuovo tentativo di consegna per una fatturaInvoiceSentErrorTutti gli 8 tentativi sono falliti, la fattura non è stata consegnataOrderSentRetryÈ stato avviato un nuovo tentativo di consegna per un ordineOrderSentErrorTutti gli 8 tentativi sono falliti, l'ordine non è stato consegnato

Se hai configurato un webhook per questi topic, ricevi una notifica ad ogni tentativo. Dopo un InvoiceSentError o OrderSentError, è necessaria un'azione manuale: contatta il destinatario o escala tramite eConnect Support.

Suggerimento: iscriviti ai topic InvoiceSentRetry e InvoiceSentError tramite un webhook. In questo modo rilevi immediatamente i problemi di consegna e puoi agire in modo proattivo.

Consegna webhook

Per i webhook, il PSB utilizza un programma di retry separato. Se il tuo endpoint webhook non è raggiungibile o non restituisce un codice di stato 2xx, il PSB riprova la consegna dell'evento.

ParametroValoreDurata massima di retry5 giorniStrategiaExponential backoffTimeout per tentativo100 secondiEvento per tentativoHookSentRetryEvento in caso di fallimento definitivoHookSentError

Il PSB si aspetta una risposta 2xx dal tuo endpoint entro 100 secondi. Qualsiasi altra risposta (o un timeout) conta come tentativo fallito. Pertanto, elabora i webhook in arrivo il più rapidamente possibile, conferma la ricezione con un 200 OK ed esegui l'elaborazione pesante in modo asincrono in un processo in background.

Nota: se il tuo endpoint non è raggiungibile per un periodo prolungato, il PSB smette di riprovare dopo 5 giorni. Gli eventi persi possono ancora essere recuperati tramite l'endpoint batch. Consulta Batch hooks per maggiori informazioni.

Hostname PSB per whitelist di rete

Per le integrazioni che accedono alla PSB da una rete protetta (firewall, proxy, lista di autorizzazione), devono essere consentiti sia gli hostname principali che quelli di failover. everbinding.nl è il dominio legacy di eConnect ed è attivamente utilizzato per il failover PSB.

AmbientePrincipaleFailoverProduzionepsb.econnect.euapi.everbinding.nlAccettazioneaccp-psb.econnect.eutestapi.everbinding.nl

Inserisci in whitelist tutti e quattro gli hostname sulla porta 443 (HTTPS). Senza gli hostname di failover, una connessione PSB valida può diventare irraggiungibile durante un evento di failover, mentre la PSB stessa è ancora in esecuzione.

Riepilogo: riprovabile o no?
Codice di statoRiprovabileStrategia200 OKNon necessarioElaborato201 CreatedNon necessarioElaborato202 AcceptedNon necessarioControllare lo stato successivamente204 No ContentNon necessarioElaborato400 Bad RequestNoCorreggi la richiesta401 UnauthorizedNoRichiedi nuovo token403 ForbiddenNoVerifica i permessi404 Not FoundNoVerifica URL/risorsa405 Method Not AllowedNoVerifica il metodo HTTP409 ConflictNoIl documento era già stato elaborato413 Content Too LargeNoRiduci la dimensione del file415 Unsupported Media TypeNoCorreggi l'header Content-Type422 Unprocessable EntityNoVerifica struttura documento/business rule429 Too Many RequestsAttendi Retry-After, exponential backoff500 Internal Server ErrorExponential backoff502 Bad GatewayExponential backoff503 Service UnavailableExponential backoff504 Gateway TimeoutExponential backoff

In sintesi Gli errori del client (4xx) richiedono la tua attenzione: correggi il problema nella richiesta. Gli errori del server (5xx) sono temporanei e possono essere riprovati in sicurezza con exponential backoff. Utilizza sempre l'header X-EConnect-DocumentId per evitare l'elaborazione duplicata nei retry. Il PSB riprova automaticamente la consegna dei documenti fino a 8 volte in circa 35 ore, e i webhook per un massimo di 5 giorni.

Consulta la documentazione completa dell'API