Zpracování chyb: HTTP kódy, retries a robustní integrace

HTTP stavové kódy, chybové odpovědi a retry logika PSB API: jak vybudovat robustní integraci.

Každá API integrace dříve nebo později narazí na chyby. Výpadek sítě, nedostupný server, nesprávně formátovaný dokument: to patří k věci. PSB API komunikuje chyby prostřednictvím standardních HTTP stavových kódů a strukturovaných JSON odpovědí. Navíc PSB má zabudovaný retry mechanismus, který automaticky řeší dočasné chyby při doručování dokumentů.

V tomto článku se dozvíte, jaké stavové kódy PSB vrací, jak interpretovat chybové odpovědi, kdy můžete bezpečně zopakovat požadavek a jak funguje automatický retry mechanismus PSB.

HTTP stavové kódy

PSB API používá standardní HTTP stavové kódy k indikaci výsledku požadavku. Stavové kódy se dělí do dvou kategorií: chyby klienta (4xx), které musíte opravit sami, a chyby serveru (5xx), které můžete zopakovat.

Úspěšná odpověď
KódVýznamVysvětlení200OKPožadavek byl úspěšně zpracován201CreatedVytvořen nový objekt (například hook, subscriber nebo dokument/zdroj)202AcceptedPožadavek přijat pro asynchronní/frontové zpracování; stav zkontrolujte později204No ContentPožadavek úspěšný bez těla odpovědi (například při DELETE nebo aktualizaci bez těla)
Chyby klienta (4xx): neretryovat

Při 4xx chybě je problém v samotném požadavku. Opětovné odeslání se stejnými daty vyprodukuje stejný výsledek. Opravte příčinu před dalším pokusem.

KódVýznamKdyAkce400Bad RequestChyba validace nebo syntaktická chyba v dokumentuZkontrolujte tělo požadavku. JSON odpověď obsahuje podrobnosti o tom, co se pokazilo401UnauthorizedNebyl odeslán token, nebo token vypršel či je neplatnýVyžádejte si nový Bearer token z Identity Serveru403ForbiddenToken je platný, ale akce není povolena. Nejčastěji: používáte partyId, ke kterému váš účet nemá přístup. Další příčiny: expirovaný bearer token, neplatná subscription key nebo endpoint, který není dostupný pro vaši úroveň autorizaceZkontrolujte, zda používáte správné partyId a zda uživatel, který získal bearer token, má k tomuto partyId přístup. V případě pochybností: získejte nový token přes Identity Server404Not FoundPožadovaný endpoint nebo zdroj neexistuje (například neznámé Document ID, hook nebo PartyID). Při odesílání se to též vyskytuje u kombinace "No valid delivery options. PartyId '...' not found in Peppol" (mimo jiné u VerstuurInvoice): nabízené PartyId není (pro tento typ dokumentu) na Peppol/SMPZkontrolujte URL, Document ID a partyId. U "PartyId not found in Peppol": nejprve proveďte lookup přes queryRecipientParty nebo lookup.peppol.org na nabízeném ID, poté volitelně zkontrolujte související schemas (například BE 0208 versus 9925/BE:VAT, stejné základní číslo) -- změnu EndpointID doporučte jen při potvrzeném výsledku lookup. Žádný výsledek u žádného kandidátského ID: příjemce není dosažitelný na těchto identifikátorech; klient se musí u příjemce zeptat na registraci nebo jiné dodávací ID405Method Not AllowedPoužitá HTTP metoda není na tomto endpointu podporovánaZkontrolujte API dokumentaci pro správnou metodu (GET/POST/PUT/DELETE)409ConflictDokument již byl zpracován (idempotency)Žádná akce není potřeba: dokument byl úspěšně přijat dříve. Viz idempotency413Content Too LargeSoubor překračuje maximální velikostZmenšete dokument nebo přílohy. IDR limit: 15 MB415Unsupported Media TypeChybí hlavička Content-Type nebo je nesprávnáPoužijte správný content-type, například application/json, kde je vyžadován422Unprocessable EntityPožadavek je technicky správný, ale obsah nelze zpracovat (například neplatné UBL, chyba validace Peppol nebo porušená business rule)Zkontrolujte strukturu dokumentu a business rules; JSON odpověď obvykle obsahuje podrobnosti400 (duplicitní agentury)Duplicitní schéma identifikátoruDva nebo více identifikátorů se stejným kódem schématu/agentury v jednom volání queryRecipientParty. Chybová zpráva: EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.' (kde {code} je kód agentury bez úvodní nuly, např. schéma 0208208).Uvedeďte pouze jeden identifikátor na schéma na volání. Více kandidátů v rámci stejného schématu: provedťte samostatná volání.

API403 Access forbidden: doslovná chybová zpráva [API403] Access forbidden. Please check PartyId authorization and make sure the Subscription-Key is valid se mimo jiné může objevit při neúspěšném odeslání Peppol z Business Central ("delivery failed"), příčina je ale obecná pro PSB, nikoli specifická pro BC. Pořadí diagnózy:

  1. Zkontrolujte autorizaci PartyId: používáte správné partyId a má propojení účtu práva k této party?
  2. Obnovte Bearer token, pokud vypršel nebo je neplatný.
  3. Zkontrolujte Subscription-Key pouze pokud je tento header stále povinný (legacy/Collabrr/API31) -- ne jako výchozí první krok.

Poznámka: zmínka o "Subscription-Key" v chybové zprávě automaticky neznamená, že klíč je třeba obnovit. Autorizace PartyId a problém s propojením na straně platformy jsou stejně častou příčinou. Pokud doručení nadále selhává i po platné kontrole tokenu a partyId, eskalujte na podporu eConnect, místo opakovaného otáčení Subscription-Key.

Validace SBDH obálky (API400.USRMS1 / API400.USRMS2): tyto chybové kódy indikují nesoulad mezi Peppol obálkou (SBDH) a samotným dokumentem e-faktury. U USRMS1 odesílatel nebo příjemce v obálce neodpovídá identifikátorům v XML faktury. U USRMS2 PSB nemůže najít rozpoznatelného odesílatele v dokumentu. Zkontrolujte, zda EndpointID a PartyIdentification ve vašem UBL odpovídají hodnotám poskytnutým při odesílání. PSB odmítne dokument na úrovni AS4 a vrátí chybu odesílajícímu Access Pointu.

Omezování počtu požadavků (429): lze retryovat

Výjimka z pravidla „pouze 5xx lze retryovat“: 429 Too Many Requests indikuje omezování počtu požadavků a lze jej retryovat. Počkejte a respektujte hlavičku Retry-After, než požadavek znovu odesláte.

KódVýznamKdyAkce429Too Many RequestsOmezování počtu požadavků: odesíláte příliš mnoho požadavků v časovém okněPočkejte a respektujte hlavičku Retry-After, poté opakujte
Chyby serveru (5xx): retryovat

5xx chyba indikuje dočasný problém na straně serveru. Samotný požadavek může být správný. Spolu s 429 jsou to jediné stavové kódy, u kterých má opakování smysl.

KódVýznamKdyAkce500Internal Server ErrorNeočekávaná chyba serveruRetryujte s exponential backoff502Bad GatewayNeplatná odpověď od navazující služby; obvykle dočasnéRetryujte s exponential backoff503Service UnavailablePSB je dočasně nedostupný (údržba, přetížení)Retryujte s exponential backoff504Gateway TimeoutNavazující služba neodpovídá včasRetryujte s exponential backoff

Poznámka: endpoint pro odesílání akceptuje maximálně 24 MB na požadavek, včetně HTTP overheadu. Payloady překračující tento limit jsou odmítnuty webovým serverem s HTTP 500 místo 413, protože odmítnutí nastane před validací na aplikační vrstvě. Mějte to na paměti u base64-kódovaných příloh: zvětšují velikost souboru přibližně o 33 %.

API500UH během deploymentů: chybový kód API500UH (Unhandled error) se může objevit, když PSB provádí interní aktualizaci služby (Service Fabric deployment). V mnoha případech byl dokument již úspěšně doručen příjemci, ale potvrzovací krok selhal kvůli migraci. Retry mechanismus PSB automaticky pokouší dokončit zbývající kroky. Pokud obdržíte API500UH, zkontrolujte prostřednictvím stavových událostí, zda byl dokument doručen, než jej znovu odešlete.

Čtení chybových odpovědí

Při 4xx chybě odpověď obsahuje JSON tělo popisující problém. Tyto informace vám pomohou rychle identifikovat příčinu.

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

Při 5xx chybě odpověď není vždy strukturovaná. Založte svou retry logiku na HTTP stavovém kódu, nikoli na obsahu těla.

Strategie retryování pro vaši integraci

Ne každá chyba si zaslouží retry. Pravidlo je jednoduché: pouze 5xx stavové kódy a síťové timeouty stojí za opakování. Při 4xx chybách musíte požadavek upravit před opětovným odesláním.

Exponential backoff

Doporučená strategie retryování je exponential backoff: začněte s krátkou čekací dobou a zdvojnásobte ji při každém dalším pokusu.

PokusČekací doba11 sekunda22 sekundy34 sekundy48 sekund516 sekund632 sekund7+60 sekund (maximum)

Tip: přidejte k čekací době malý náhodný rozptyl (jitter). Pokud po výpadku retryuje více klientů současně, jitter zabrání tomu, aby všichni zasáhli server ve stejný okamžik.

Bezpečné retries s idempotency

Vždy kombinujte retry logiku s hlavičkou X-EConnect-DocumentId. Zahrnutím stejného documentId při každém pokusu PSB garantuje, že dokument nebude nikdy zpracován dvakrát. Pokud PSB obdrží documentId, který již byl zpracován, vrátí 409 Conflict jako potvrzení.

Viz Idempotency: zabránění duplicitnímu odesílání pro úplné vysvětlení a příklady kódu.

Rozhodovací strom
Automatický retry mechanismus PSB

Kromě retry logiky, kterou implementujete sami, má PSB vlastní retry mechanismus pro doručování dokumentů. Pokud PSB pokouší doručit fakturu nebo objednávku příjemci a ten vrátí 5xx chybu, PSB automaticky obnoví doručování.

Doručování dokumentů (faktury a objednávky)

PSB provede až 8 retry pokusů rozložených přibližně na 35 hodin. Při každém pokusu PSB publikuje událost, takže můžete sledovat průběh:

UdálostVýznamInvoiceSentRetryZahájen nový pokus o doručení fakturyInvoiceSentErrorVšech 8 pokusů selhalo, faktura nemohla být doručenaOrderSentRetryZahájen nový pokus o doručení objednávkyOrderSentErrorVšech 8 pokusů selhalo, objednávka nemohla být doručena

Pokud máte nakonfigurovaný webhook pro tato témata, obdržíte notifikaci při každém pokusu. Po InvoiceSentError nebo OrderSentError je vyžadována manuální akce: kontaktujte příjemce nebo eskalujte přes eConnect Support.

Tip: přihlaste se k odběru témat InvoiceSentRetry a InvoiceSentError prostřednictvím webhooku. Tímto způsobem okamžitě detekujete problémy s doručováním a můžete jednat proaktivně.

Doručování webhooků

Pro webhooky PSB používá samostatný retry plán. Pokud je váš webhook endpoint nedostupný nebo nevrátí 2xx stavový kód, PSB opakuje doručení události.

ParametrHodnotaMaximální doba retryování5 dníStrategieExponential backoffTimeout na pokus100 sekundUdálost na pokusHookSentRetryUdálost při definitivním selháníHookSentError

PSB očekává 2xx odpověď od vašeho endpointu do 100 sekund. Jakákoliv jiná odpověď (nebo timeout) se počítá jako neúspěšný pokus. Proto zpracovávejte příchozí webhooky co nejrychleji, potvrďte příjem odpovědí 200 OK a náročné zpracování provádějte asynchronně v background procesu.

Poznámka: pokud je váš endpoint nedostupný po delší dobu, PSB přestane retryovat po 5 dnech. Zmeškané události lze stále získat prostřednictvím batch endpointu. Viz Batch hooks pro více informací.

Názvy hostitelů PSB pro whitelist sítě

U integrací, které přistupují k PSB z chráněné sítě (firewall, proxy, seznam povolených), musí být povoleny jak primární, tak failover názvy hostitelů. everbinding.nl je starší doména eConnect a je aktivně používána pro failover PSB.

ProstředíPrimárníFailoverProdukcepsb.econnect.euapi.everbinding.nlAkceptaceaccp-psb.econnect.eutestapi.everbinding.nl

Přidávejte všechny čtyři názvy hostitelů na whitelist na portu 443 (HTTPS). Bez názvů hostitelů failover se může platné připojení PSB během selhání strom stat nedostupné, zatímco PSB sama funguje.

Přehled: retryovatelné nebo ne?
Stavový kódRetryovatelnýStrategie200 OKNení potřebaZpracováno201 CreatedNení potřebaZpracováno202 AcceptedNení potřebaStav zkontrolovat později204 No ContentNení potřebaZpracováno400 Bad RequestNeOpravit požadavek401 UnauthorizedNeVyžádat nový token403 ForbiddenNeZkontrolovat oprávnění404 Not FoundNeZkontrolovat URL/zdroj405 Method Not AllowedNeZkontrolovat HTTP metodu409 ConflictNeDokument již byl zpracován413 Content Too LargeNeZmenšit velikost souboru415 Unsupported Media TypeNeOpravit hlavičku Content-Type422 Unprocessable EntityNeZkontrolovat strukturu dokumentu/business rules429 Too Many RequestsAnoPočkat na Retry-After, exponential backoff500 Internal Server ErrorAnoExponential backoff502 Bad GatewayAnoExponential backoff503 Service UnavailableAnoExponential backoff504 Gateway TimeoutAnoExponential backoff

Ve zkratce Chyby klienta (4xx) vyžadují vaši pozornost: opravte problém v požadavku. Chyby serveru (5xx) jsou dočasné a lze je bezpečně retryovat s exponential backoff. Vždy používejte hlavičku X-EConnect-DocumentId, abyste zabránili duplicitnímu zpracování při retries. PSB automaticky retryuje doručování dokumentů až 8krát během přibližně 35 hodin a webhooky po dobu až 5 dní.

Zobrazit kompletní API dokumentaci