Zum Inhalt springen

Idempotence vs. opakované požadavky: klíč k spolehlivému API

Aus Test


Co se skutečně děje při sestavení a spuštěn

Druhým častým omylem je ignorování kompatibility licencí. Ne všechny licence lze libovolně kombinovat. Když do projektu přidáte kód pod licencí, která vyžaduje jiné podmínky šíření, než má zbytek, vznikne neřešitelný konflikt. Výsledek nelze legálně distribuovat, dokud jeden z kusů neodstraníte nebo nepřevedete. Před sloučením cizího kódu si proto vždy ověřte, zda jeho licence dovoluje spojení s tou vaší. Stejně tak pozor na soubory bez licenční hlavičky – chybějící informace znamená, že autor si všechna práva vyhrazuje a kód použít nesmíte.

Idempotentní klíč jako smlouva mezi klientem a serverem Řešení rady pro rekonstrukci POST spočívá v tom, že klient vygeneruje unikátní hodnotu – idempotentní klíč – a pošle ji v hlavičce, například Idempotency-Key: 8f3a1c9e-.... Server si klíč uloží ke konkrétní operaci a při dalším požadavku se stejným klíčem už nevykoná akci znovu. Místo toho vrátí původní odpověď, včetně stavového kódu a těla. Klíč by měl být náhodný, nikoli odvozený z obsahu požadavku, a měl by platit omezenou dobu – typicky hodiny až dny. Uložiště musí být spolehlivé a atomické: pokud dva požadavky se stejným klíčem dorazí současně, jeden získá zámek, druhý počká nebo dostane chybu.

Generátor často vytváří hodnoty, které projdou validací, ale nedávají smysl v kontextu aplikace. Typický příklad: náhodné datum narození vygeneruje budoucnost, nebo datum před rokem 1900. Test pak projde, ale v produkci selže, protože reálný uživatel zadá něco jiného. Proto je nutné definovat rozsahy a omezení ručně. Náhodnost používejte jen tam, kde je skutečně potřeba rozptyl, a úložné prostory v malém bytěšude jinde ji nahraďte pevnými hodnotami. Testy s pevnými daty jsou čitelnější a rychlejší.

Kontrast, hierarchie a stavové informa

Častou chybou je ukládat idempotentní klíč až po dokončení operace. Tím vzniká okno, kdy se požadavek zpracovává a druhý příchozí klíč ještě nevidí – oba projdou a vytvoří duplicitu. Správně se klíč rezervuje před zpracováním, ideálně v transakci, a výsledek se k němu přiřadí po dokončení. Pokud operace selže, klíč se buď uvolní, nebo se uloží i chybová odpověď, aby se při opakování nezkoušela znovu. Záleží na tom, zda je bezpečné akci opakovat.

Základní tvrzení obstará obyčejný assert. Žádné assertEqual, assertTrue a podobné metody. Když test selže, pytest sám zobrazí hodnoty obou stran výrazu, takže není potřeba psát vlastní chybové zprávy. Pozor na jeden častý omyl: do testů nepatří volání print pro ladění. Mnohem lepší je spustit pytest s přepínačem -s, který výstup nezachytává, nebo použít --pdb, jenž při chybě otevře interaktivní debugger přímo v místě selhání.

Zavedení idempotentních klíčů není složité, ale vyžaduje disciplínu na obou stranách. Klient musí klíč generovat a opakovat požadavek se stejným klíčem, server musí klíč ověřovat, ukládat a vracet konzistentní odpovědi. Když to funguje, opakované požadavky přestanou být hrozbou a stanou se běžnou součástí provozu.

Opakovaný požadavek na REST API vzniká běžně – klient nedostal odpověď, síť vypadla, uživatel znovu stiskl tlačítko. Pokud server není idempotentní, druhé volání může vytvořit duplicitní záznam, strhnout platbu dvakrát nebo přepsat data, která měla zůstat nedotčená. Idempotence neznamená, že se požadavek nesmí opakovat. Znamená, že jeho opakované provedení má stejný výsledný stav jako provedení jediné. U GET, PUT a DELETE je to přirozené – čtení, rekonstrukce koupelny krok za krokem nahrazení celého zdroje a smazání jsou bezpečné i při více voláních. Problém nastává u POST, který typicky vytváří nový zdroj.

Idempotence se netýká jen vytváření. U aktualizací pomocí PATCH je vhodné posílat verzi zdroje nebo časové razítko a odmítnout zastaralé požadavky. U plateb a objednávek je idempotentní klíč prakticky nutnost, protože duplicita znamená přímou škodu. U jednoduchých čtení a mazání stačí spoléhat na přirozenou idempotenci HTTP metod. Vždy je ale potřeba otestovat scénáře se souběžnými požadavky, výpadky sítě a opakováním po timeoutu. Bez testů se chyba projeví až v produkci, kdy ji opravujete pod tlakem.

Další častá chyba je vracet při opakovaném požadavku jiný stavový kód. Pokud první volání vrátilo 201 Created, druhé by mělo vrátit stejný výsledek, ne 409 Conflict. Klient se podle kódu rozhoduje, a pokud dostane konflikt, If you cherished this report and you would like to acquire extra information regarding úložné prostory v malém bytě kindly stop by our own web-page. může se domnívat, že jeho původní požadavek neprošel. Stejně tak tělo odpovědi musí odpovídat původnímu vytvořenému zdroji. Pokud se klíč už použil na jiný typ operace nebo na jiná data, je správné vrátit 422 nebo 400 – server tím říká, že klíč je vázaný na jiný kontext.