Înapoi la catalog
Season 8 19 Episoade 1h 17m 2026

OpenAPI and Swagger Ecosystem

Ediția 2026. Un ghid complet pentru 2026 privind stăpânirea specificației OpenAPI v3.1 și a lanțului de instrumente open-source Swagger. Învață să proiectezi, să documentezi și să automatizezi REST API-urile folosind abordarea definitivă design-first.

Design API Validarea datelor
OpenAPI and Swagger Ecosystem
Se redă acum
Click play to start
0:00
0:00
1
Contractul API
O introducere în specificația OpenAPI și lanțul de instrumente Swagger. Află de ce API-urile au nevoie de un format standard de descriere și cum acesta facilitează dezvoltarea design-first.
4m 10s
2
Ecosistemul Swagger
O mapare la nivel înalt a instrumentelor open-source construite în jurul specificației OpenAPI. Explorăm rolurile Swagger Editor, Swagger UI și Swagger Codegen.
4m 03s
3
Anatomia unui document OpenAPI
Înțelegerea fundației structurale a unui document OpenAPI 3.1. Acoperim formatele suportate, versionarea și interoperabilitatea structurală.
4m 06s
4
Pregătirea terenului: Info și Servers
Definirea metadatelor și a mediilor pentru API-ul tău. Explorăm Info Object și Server Object pentru a oferi context esențial consumatorilor de API.
3m 59s
5
Maparea Paths și Operations pentru API
Crearea planului pentru API-ul tău. Învață cum să definești rutele folosind Paths Object și să specifici metodele HTTP cu Operation Object.
4m 23s
6
Endpoint-uri dinamice cu Parameters
Transformarea endpoint-urilor în unele dinamice folosind path templating și Parameter Object. Acoperim parametrii de tip path, query, header și cookie.
4m 09s
7
Structurarea datelor de intrare: Request Bodies
Gestionarea payload-urilor de date complexe. Aprofundează Request Body Object și învață cum să gestionezi negocierea conținutului prin Media Types.
3m 40s
8
Așteptări și erori: Responses
Definirea rezultatelor unui apel API folosind Responses Object. Explorăm maparea codurilor de stare HTTP la structuri specifice de răspuns și soluția de rezervă default response.
3m 52s
9
Reutilizare cu Components
Păstrarea specificației tale DRY (Don't Repeat Yourself). Descoperă cum să folosești Components Object și Reference Objects ($ref) pentru a partaja definiții în întregul document.
4m 23s
10
Tipuri de date și Schemas
Impunerea regulilor pentru date folosind Schema Object. Acoperim integrarea OpenAPI cu JSON Schema Draft 2020-12, formatele de date și tipurile primitive.
4m 10s
11
Definirea Security Schemes
Încuierea ușii principale a API-ului tău. Învață cum să configurezi Security Scheme Object pentru chei API, autentificare HTTP (Basic/Bearer) și OAuth2.
4m 23s
12
Aplicarea Security Requirements
Securizarea operațiunilor tale. Explorăm Security Requirement Object și cum să aplici regulile de autentificare la nivel global sau per rută.
4m 15s
13
API-uri asincrone cu Webhooks
Gestionarea cererilor out-of-band. Aprofundează funcționalitatea Webhooks introdusă în OpenAPI 3.1 și înțelege cum diferă de Callbacks tradiționale.
3m 49s
14
Tranziții de stare cu Links
Maparea dinamică a fluxurilor de lucru API. Explorăm Link Object pentru a descrie relațiile dintre operațiuni, oferind o abordare pragmatică pentru HATEOAS.
4m 08s
15
Documentație interactivă cu Swagger UI
Dând viață specificației tale. Descoperă cum să instalezi și să servești Swagger UI pentru a oferi un portal de documentație interactiv și vizual pentru dezvoltatori.
3m 48s
16
Personalizarea Swagger UI
Adaptarea experienței dezvoltatorului. Aprofundăm configurarea Swagger UI, modificarea opțiunilor de afișare și activarea funcționalităților precum deep linking și syntax highlighting.
3m 57s
17
Proiectarea cu Swagger Editor
Scrierea definițiilor API cu feedback instantaneu. Explorează funcționalitățile, instalarea și capacitățile de validare în timp real ale clasicului Swagger Editor.
3m 28s
18
Automatizarea cu Swagger Codegen
Transformarea specificațiilor în cod boilerplate. Învață cum Swagger Codegen v3 folosește documentul tău OpenAPI pentru a genera instantaneu server stubs și biblioteci client.
4m 29s
19
Viitorul: Swagger Editor Next
Îmbrățișarea evoluției designului API. Introducem Swagger Editor Next, arhitectura sa și suportul său puternic pentru OpenAPI 3.1 și specificația AsyncAPI.
3m 57s

Episoade

1

Contractul API

4m 10s

O introducere în specificația OpenAPI și lanțul de instrumente Swagger. Află de ce API-urile au nevoie de un format standard de descriere și cum acesta facilitează dezvoltarea design-first.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Ecosistemul OpenAPI și Swagger, episodul 1 din 19. API-urile alimentează web-ul modern, dar cum comunică între ele fără un proces nesfârșit de trial and error? Ai nevoie de o metodă sigură de a ști exact ce așteaptă un server și ce va returna, înainte de a scrie măcar o linie de cod. Acest mecanism este contractul API, guvernat de specificația OpenAPI. Specificația OpenAPI este o interfață standardizată, independentă de limbaj, pentru API-urile REST. Gândește-te la ea ca la un plan arhitectural. Atunci când este definită corect, atât un om, cât și un sistem pot analiza acest plan și pot înțelege exact ce face un serviciu. Nu au nevoie de acces la source code, nu trebuie să citească documentație PDF separată și nu trebuie să inspecteze traficul de rețea live. Specificația prezintă clar endpoint-urile disponibile, input-urile precise pe care le necesită și structura exactă a datelor pe care le returnează. Este scrisă în plain text, folosind fie YAML, fie JSON, ceea ce o face ușor de citit atât de tool-uri automate, cât și de developeri. Dacă lucrezi cu API-uri, probabil ai auzit termenul Swagger. Oamenii folosesc adesea Swagger și OpenAPI ca sinonime, dar astăzi reprezintă concepte complet diferite. Inițial, specificația în sine se numea Swagger. În 2015, creatorii au donat specificația către Linux Foundation, unde a fost redenumită oficial Specificația OpenAPI. Astăzi, OpenAPI se referă strict la reguli și la standard. Swagger se referă la ecosistemul de tool-uri comerciale și open-source construite de SmartBear care implementează aceste reguli. De exemplu, Swagger UI generează documentație interactivă, iar Swagger Editor te ajută să scrii fișierele. Scrii un document OpenAPI, dar poți folosi tool-urile Swagger pentru a-l vizualiza. Asta ne aduce la adevărata putere a specificației, și anume abordarea design-first development. Fără un contract clar, dezvoltarea unui API se desfășoară de obicei liniar. Echipa de backend scrie codul, expune un nou endpoint și apoi predă o documentație scrisă. Între timp, echipa de frontend stă pe bară, așteptând ca backend-ul să termine, astfel încât să poată începe să integreze user interface-ul. Iată ideea cheie. Când adopți OpenAPI, inversezi acest proces. Înainte ca cineva să scrie codul aplicației, ambele echipe cad de acord asupra documentului OpenAPI. Acest fișier text devine un contract strict care elimină orice incertitudine. Echipa de backend îl folosește pentru a genera server stubs și pentru a valida că implementarea lor îndeplinește cerințele convenite. Simultan, echipa de frontend folosește exact același document pentru a genera mock servers. Ei pot începe imediat să construiască user interface-ul, făcând network requests către un backend simulat care se comportă exact așa cum o va face API-ul final. Niciuna dintre echipe nu o blochează pe cealaltă. Pentru că acest contract este machine-readable, rezolvă definitiv și problema documentației învechite. Când o cerință API se modifică, actualizezi mai întâi fișierul de specificații. Tooling-ul tău regenerează apoi automat documentația web, acele mock servers și client libraries. Documentația și codul rămân perfect sincronizate deoarece au un single source of truth. O specificație API nu este doar un mecanism pentru generarea de pagini web frumoase; este un protocol de comunicare fundamental pentru echipele tale de inginerie care transformă presupunerile umane în reguli executabile. Dacă îți place emisiunea și vrei să ne susții, caută DevStoriesEU pe Patreon. Mulțumesc că ne-ai ascultat. Pe data viitoare!
2

Ecosistemul Swagger

4m 03s

O mapare la nivel înalt a instrumentelor open-source construite în jurul specificației OpenAPI. Explorăm rolurile Swagger Editor, Swagger UI și Swagger Codegen.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 2 din 19. Să scrii documentație este plictisitor, dar cum ar fi dacă codul tău ar scrie documentația, iar documentația ta ar scrie codul? Acest workflow bidirecțional este promisiunea principală a ecosistemului open-source Swagger. O concepție greșită des întâlnită este că trebuie să adopți întregul ecosistem simultan. Nu e cazul. Toolset-ul este complet modular. Poți alege componente individuale în funcție de nevoile tale specifice de workflow, indiferent dacă doar randezi o documentație existentă sau faci scaffolding pentru un backend complet nou. Tool-urile open-source principale funcționează ca un pipeline. Proiectezi API-ul în Swagger Editor, îl vizualizezi în Swagger UI și automatizezi implementările folosind Swagger Codegen. Swagger Editor este locul unde începe proiectarea API-ului. Este un mediu browser-based în care scrii specificația OpenAPI în YAML sau JSON. Pe măsură ce tastezi, editorul îți validează continuu sintaxa conform regulilor specificației OpenAPI. Dacă pui greșit un câmp sau definești un data type invalid, editorul semnalează imediat eroarea. Oferă o vizualizare split-screen în timp real, afișând textul raw pe o parte și un preview vizual pe cealaltă. Odată ce contractul este valid, poți trece la automatizare cu Swagger Codegen. Acest tool preia fișierul tău cu specificația OpenAPI și îl traduce în cod sursă funcțional. Suportă zeci de limbaje și framework-uri. Poți genera server stubs, care îți oferă boilerplate routing și controllerele pentru backend-ul tău. Alternativ, poți genera client SDK-uri, pe care aplicațiile consumer le folosesc pentru a interacționa cu API-ul tău fără să fii nevoit să scrii logică custom de HTTP request. Apoi, avem Swagger UI. Acest tool îți parsează specificația și o randează sub forma unei pagini de documentație interactive, web-based. Merge dincolo de textul static. Swagger UI generează câmpuri de input și butoane de execuție direct din definițiile API-ului tău. Utilizatorii pot introduce parametri, pot atașa token-uri de autentificare, pot trimite request-uri HTTP reale către API endpoint-urile tale și pot inspecta răspunsurile direct în browser. Ia în considerare un workflow concret care combină aceste trei tool-uri. Începi în Swagger Editor, redactând specificația pentru un nou API de user management. Definești endpoint-urile, request payload-urile și răspunsurile așteptate. Odată ce contractul este complet, trimiți acel fișier în Swagger Codegen, configurându-l să genereze un server stub Node.js. Codegen generează automat structura de directoare, configurația pachetului și route handler-ele. Trebuie doar să scrii logica de business specifică și query-urile de bază de date în interiorul acelor controllere pre-wired. Între timp, îi dai exact același fișier cu specificația OpenAPI echipei tale de QA, servit prin Swagger UI. Inginerii QA nu trebuie să citească fișierul tău YAML sau să se uite pe codul tău Node.js. Ei deschid pagina web Swagger UI, văd input-urile necesare și încep imediat să trimită test payloads către noul tău server Node.js. Iată ideea cheie. Ecosistemul open-source Swagger mută dezvoltarea de API-uri de la a scrie cod de backend și a spera că documentația rămâne corectă, la a defini mai întâi un contract strict, unde documentația user-facing și server boilerplate-ul sunt generate din exact aceeași sursă de adevăr. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
3

Anatomia unui document OpenAPI

4m 06s

Înțelegerea fundației structurale a unui document OpenAPI 3.1. Acoperim formatele suportate, versionarea și interoperabilitatea structurală.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 3 din 19. Înainte să poți mapa un API complex, ai nevoie de o pânză goală, dar dacă începi cu o structură de bază greșită, asta îți va strica în tăcere întregul toolchain mai târziu. Asta ne aduce la Anatomia unui Document OpenAPI. În esență, un document OpenAPI este definit strict ca un obiect JSON. Poți scrie fișierul folosind formatul JSON sau formatul YAML. Tooling-ul suportă ambele variante, iar modelul de date din spate rămâne exact același. Pentru că se mapează direct pe un obiect JSON standard, regulile de formatare sunt rigide. Fiecare nume de câmp este complet case-sensitive. Dacă specificația dictează un nume de câmp cu literă mică, să-l scrii cu majusculă la început înseamnă că parserul îl va ignora sau va arunca o eroare. Când îți organizezi proiectul, ai de ales în privința structurii documentului. Poți defini totul într-un singur fișier monolitic. Alternativ, poți împărți definițiile într-un setup multi-document. Într-un setup multi-document, un fișier root acționează ca entry point și face legătura cu fișiere externe folosind pointeri de referință. Indiferent dacă folosești un fișier sau cincizeci, parserul le rezolvă în cele din urmă într-un singur obiect JSON logic în memorie. Ia un scenariu concret. Începi un proiect complet nou. Creezi un fișier text gol numit openapi dot yaml. Înainte să încerci să proiectezi vreo logică, vrei să stabilești un baseline validat. Pentru a trece de un validator de schemă, pânza ta goală trebuie să conțină exact două câmpuri la nivel root. Primul câmp obligatoriu se numește openapi. Valoarea sa este un string care specifică versiunea exactă a specificației OpenAPI pe care o folosești, cum ar fi 3.1.0. Este extrem de frecvent să confunzi acest câmp cu versiunea propriului tău API. Nu au nicio legătură. String-ul de versiune openapi există strict pentru compatibilitatea tooling-ului. Când un code generator sau un documentation viewer îți deschide fișierul, citește mai întâi acest câmp pentru a determina ce reguli de parsing să aplice. Dacă declari 3.0.0 aici, dar folosești features din 3.1.0, tool-urile tale de validare vor eșua deoarece îți evaluează documentul în funcție de un set de reguli greșit. Iată ideea cheie. Al doilea câmp root obligatoriu este locul unde pui detaliile API-ului tău propriu-zis. Acest câmp este obiectul info. Obiectul info furnizează metadatele aplicației tale. Nu vom detalia conținutul său intern aici, în afară de a spune că necesită un titlu și propriul său string de versiune. Acel string de versiune intern din obiectul info este locul unde definești dacă aplicația ta este la versiunea unu sau versiunea doi. Odată ce fișierul tău openapi dot yaml conține doar aceste două câmpuri root, openapi și info, ai un document OpenAPI complet din punct de vedere structural. Poți rula acest fișier printr-un validator chiar acum, iar acesta va trece fără probleme. Stabilirea acestei structuri minime valide asigură că parserul și toolchain-ul tău funcționează perfect înainte să introduci complexitatea logicii de routing propriu-zise. Mulțumesc pentru ascultare, happy coding tuturor!
4

Pregătirea terenului: Info și Servers

3m 59s

Definirea metadatelor și a mediilor pentru API-ul tău. Explorăm Info Object și Server Object pentru a oferi context esențial consumatorilor de API.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 4 din 19. Dacă API-ul tău pică, cum știe un consumator pe cine să contacteze? Răspunsul se află chiar în partea de sus a spec-ului tău. Vorbim despre pregătirea terenului: Info și Servers. Înainte ca un developer să facă un request sau să inspecteze un data model, are nevoie de context. Obiectele Info și Server oferă exact acest lucru. Gândește-te la ele ca la pagina de copertă și la agenda API-ului tău. Obiectul Info este hub-ul tău de metadata. Două câmpuri de aici sunt strict obligatorii. Primul este titlul, care este pur și simplu numele human-readable al aplicației tale. Al doilea este versiunea. Oamenii confundă adesea asta cu versiunea de spec OpenAPI. Sunt complet separate. Versiunea OpenAPI îi spune parser-ului ce set de reguli de sintaxă să urmeze. Versiunea Info este propriul tău număr de release al API-ului, ceva de genul 1.0.5. Îi spune consumatorului la ce iterație a produsului se uită. Dincolo de câmpurile obligatorii, obiectul Info îți permite să adaugi context. Poți include o descriere, care acceptă formatarea CommonMark. Aceasta îți permite să scrii o documentație detaliată și ușor de citit, cu paragrafe și linkuri direct în interiorul spec-ului. De asemenea, poți defini un obiect Contact care conține un nume, un URL și o adresă de e-mail. Dacă ceva se strică sau un developer are nevoie de acces, acest lucru îi spune exact unde să meargă. În cele din urmă, obiectul License îți permite să specifici termenii legali în baza cărora funcționează API-ul, necesitând un nume și, opțional, un URL care indică textul licenței. Odată ce obiectul Info stabilește ce este API-ul, array-ul Servers îi spune consumatorului unde se află. Fără acesta, consumatorii știu ce face API-ul tău, dar nu știu unde să îl găsească. Oferi un array de obiecte Server care reprezintă diferitele medii în care este găzduit API-ul tău. Fiecare obiect Server necesită un singur câmp, care este URL-ul. Iată ideea de bază. Nu ești limitat la un singur base URL. Poți defini mai multe intrări de server pentru a reflecta infrastructura ta reală. De exemplu, primul tău obiect Server ar putea conține URL-ul tău de production utilizând o adresă HTTPS securizată, cu o descriere care îl etichetează explicit ca fiind mediul live de production. Al doilea obiect Server ar putea indica un URL de staging sau sandbox, cu o descriere care menționează că este strict pentru testare. Când îți structurezi serverele în acest fel, tool-urile interactive de documentație și client generators devin mult mai puternice. În loc să forțeze un developer să configureze manual base URL-ul pentru fiecare request, acesta poate pur și simplu să selecteze staging sau production dintr-un drop-down din interfața sa. Tool-urile parsează array-ul tău de Servers și rutează automat request-urile către host-ul corect. De asemenea, poți folosi URL-uri relative dacă documentul tău OpenAPI este găzduit direct pe serverul care furnizează API-ul. Acest lucru face mai ușor să faci deploy la exact același fișier de spec în medii diferite, fără a actualiza constant adresa de host. Definirea unor obiecte Info și Server precise înseamnă că API-ul tău nu este doar o colecție liberă de operațiuni, ci un serviciu complet identificat, clar din punct de vedere legal și localizabil fizic. Calitatea oricărei integrări automate va depinde în întregime de acuratețea acestor base URL-uri. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
5

Maparea Paths și Operations pentru API

4m 23s

Crearea planului pentru API-ul tău. Învață cum să definești rutele folosind Paths Object și să specifici metodele HTTP cu Operation Object.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 5 din 19. Fiecare REST API are nevoie de endpoint-uri, dar cum îi demonstrezi matematic unei mașini ce metode HTTP sunt permise și unde? Le mapezi logic. Astăzi, ne uităm la maparea de API Paths și Operations. Gândește-te la Paths Object din OpenAPI ca la routerul central al documentației tale. Acesta acționează ca un director care mapează URL-uri relative la capabilități specifice. Înainte de a analiza ce se află în interior, trebuie să clarificăm o neînțelegere comună. Path-urile trebuie să înceapă întotdeauna cu un forward slash. Sunt strict relative la Server URL-ul tău, niciodată absolute. Dacă API-ul tău este găzduit la api punct example punct com, path-ul tău este pur și simplu slash users, nu domeniul complet. Specificația se bazează pe această formatare exactă pentru a adăuga corect path-ul la adresa de bază a serverului. În interiorul Paths Object, definești rute individuale folosind chei de tip string. Valoarea atribuită fiecărei chei de rută se numește Path Item Object. Un Path Item Object este fundamental doar un container. Grupează toate metodele HTTP permise pe acel URL specific. Nu dictează direct input-urile sau output-urile. În schimb, conține chei care reprezintă metode HTTP standard, cum ar fi get, post, put sau delete. Când mapezi una dintre aceste metode HTTP în interiorul unui Path Item, valoarea pe care i-o atașezi este un Operation Object. Operation Object este locul unde este definită acțiunea propriu-zisă. Acesta descrie exact ce poate face un client atunci când trimite acea metodă specifică către acel path exact. Pentru a vizualiza structura, ia în considerare un endpoint standard de user management. În Paths Object-ul tău root, definești o cheie numită slash users. Valoarea atașată acesteia este Path Item Object-ul tău. În interiorul acelui container, definești o cheie get și o cheie post. Cheia get conține un Operation Object care explică modul în care API-ul returnează o listă de utilizatori. Cheia post conține un Operation Object complet separat care descrie cum să creezi un utilizator nou. Ambele operațiuni împart același URL slash users, dar specificația le tratează ca acțiuni logice distincte, nested sub cheile lor respective de metode HTTP. În interiorul fiecărui Operation Object, vei defini de obicei două câmpuri pentru a stabili identitatea: summary și operationId. Summary este un string scurt destinat cititorilor umani. Pentru metoda get de pe path-ul nostru slash users, summary-ul ar putea fi pur și simplu „Listează toți utilizatorii înregistrați”. Acesta apare în interfețele de documentație generate, astfel încât developerii să poată scana rapid endpoint-urile disponibile. Iată ideea principală. Câmpul operationId este destinat mașinilor. Este un string unic utilizat pentru a identifica operațiunea în întregul tău document API. Generatoarele de cod se bazează enorm pe operationId pentru a denumi funcțiile și metodele din SDK-urile de client pe care le construiesc. Dacă îi dai operațiunii tale get un operationId cu valoarea listUsers, clientul de Python sau TypeScript generat va conține o funcție numită specific listUsers. Acest string trebuie să fie absolut unic. Dacă două operațiuni împart același operationId, tool-urile de generare automată vor produce cod stricat sau vor da crash complet. Structura se bazează pe un nesting strict și predictibil. Path-urile se mapează la Path Items, Path Items se mapează la metode HTTP, iar metodele se mapează la Operation Objects definite prin identificatori unici. Stăpânirea acestei ierarhii exacte garantează că atât developerii umani, cât și tool-urile de automatizare downstream pot interacționa cu arhitectura API-ului tău fără să ghicească. Asta e tot pentru acest episod. Ne auzim data viitoare!
6

Endpoint-uri dinamice cu Parameters

4m 09s

Transformarea endpoint-urilor în unele dinamice folosind path templating și Parameter Object. Acoperim parametrii de tip path, query, header și cookie.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 6 din 19. Endpoint-urile statice te duc doar până la un punct. Pentru a construi un API cu adevărat util, ai nevoie de o modalitate de a transmite argumente dinamice direct prin request pentru a schimba modul în care se execută o operațiune sau ce date vizează. Acest episod este despre endpoint-uri dinamice cu parametri. Să începem cu path-ul URL-ului în sine. În OpenAPI, definești secțiuni dinamice ale unui URL folosind path templating. Faci acest lucru prin încadrarea unui nume de variabilă între acolade. Gândește-te la un API de e-commerce. Dacă vrei să faci fetch la o comandă specifică, path-ul tău arată așa: slash orders slash acoladă deschisă orderId acoladă închisă. În documentul tău OpenAPI, descrii această variabilă folosind un Parameter Object. Îi specifici locația setând câmpul in la valoarea path. Uneori, oamenii încearcă să facă path parameters opționali. Nu poți face asta. Un path parameter definește structural ruta. Dacă parametrul lipsește, ruta pur și simplu nu există. Din cauza acestei reguli, orice parametru unde locația este path trebuie să seteze mereu câmpul required la true. Ce se întâmplă dacă vrei modificatori opționali? Asta ne aduce la a doua locație, unde câmpul in este egal cu query. Query parameters apar exact la finalul URL-ului, după un semn de întrebare. Revenind la API-ul nostru de e-commerce, poate vrei o listă de comenzi, dar vrei să le vezi doar pe cele deja în tranzit. Adaugi semnul de întrebare status egal shipped la URL. Spre deosebire de path parameters, query parameters nu definesc locația resursei. Ei filtrează sau modifică rezultatul, ceea ce înseamnă că câmpul lor required poate fi setat fie la true, fie la false. URL-ul nu este singurul loc unde poți transmite parametri. Parameter Object suportă încă două locații. Setarea câmpului in la header îți permite să definești headere HTTP custom așteptate de operațiunea ta. De exemplu, poate ai nevoie de un header custom care să indice un anumit tip de device de client. Reține că headerele standard, cum ar fi Accept sau Authorization, sunt strict excluse din Parameter Object, deoarece sunt gestionate în altă parte în OpenAPI. În cele din urmă, setarea locației la cookie îți permite să documentezi parametrii transmiși prin cookie-uri de browser, cum ar fi un session token temporar. Declararea locului unde se află un parametru este doar primul pas. De asemenea, trebuie să îi definești forma. În interiorul Parameter Object, folosești câmpul schema pentru a defini tipul de date subiacent. Asta îi spune consumatorului de API exact dacă acel orderId este un integer, un string sau un format specific, cum ar fi un UUID. Apoi, ai câmpul style. Acesta dictează modul în care parametrul este serializat în request-ul HTTP. Serializarea contează profund atunci când transmiți date complexe, cum ar fi arrays sau objects. Dacă transmiți o listă de statusuri într-un query string, câmpul style determină formatul. O valoare style form ar putea separa mai multe valori cu un ampersand, în timp ce o valoare style simple generează o listă separată prin virgulă. Prin combinarea câmpurilor location, schema și style, oferi clientului instrucțiuni exacte despre cum să formateze network request-ul. Iată ideea cheie. Parameter Object nu descrie doar inputurile ca o curtoazie. El dictează strict amprenta exactă a ceea ce acceptă o operațiune, impunând tipuri de date și formate înainte ca o singură linie din logica ta de backend să ruleze. Dacă aceste episoade ți se par utile, poți susține emisiunea căutând DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mersi că asculți și continuă să construiești!
7

Structurarea datelor de intrare: Request Bodies

3m 40s

Gestionarea payload-urilor de date complexe. Aprofundează Request Body Object și învață cum să gestionezi negocierea conținutului prin Media Types.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 7 din 19. Când trimiți sute de câmpuri către un API, query parameters nu mai fac față. Ai nevoie de un pachet structurat. Acel pachet este definit prin Structuring Input Request Bodies. În timp ce request-urile GET se bazează pe URL path și pe query string, request-urile POST, PUT și PATCH fac munca grea transportând un payload. Acest payload conține date complexe, nested. În specificațiile Swagger 2.0 mai vechi, poate îți amintești că defineai body parameters sau form parameters direct alături de header și path inputs. OpenAPI versiunea 3 a schimbat fundamental acest lucru. A renunțat complet la body parameters și a introdus un singur Request Body Object dedicat. Request Body Object se află la operation level în designul API-ului tău. Caracteristica sa definitorie este că se bazează foarte mult pe content negotiation. Nu doar descrii datele; le mapezi la anumite media types. Această mapare are loc în interiorul unui content map. Acest content map este un dicționar în care cheile sunt MIME types standard, cum ar fi application slash json, iar valorile sunt Media Type Objects care detaliază cum arată acel payload specific. Imaginează-ți un client care face upload la un nou user profile. Profilul conține un nume, o adresă de e-mail, user preferences și un address object nested. În loc să înghesuie toate astea în URL variables, clientul trimite un JSON payload. În documentul tău OpenAPI, sub request body, creezi un content map cu cheia exactă application slash json. Asta declară explicit că API-ul acceptă doar JSON pentru această operațiune. Dacă un client încearcă să trimită XML sau plain text, serverul știe imediat să respingă request-ul cu o eroare de unsupported media type. Această structură este foarte flexibilă. Dacă acel upload de user profile necesită o poză de profil alături de datele textuale, o gestionezi exact în același loc. Adaugi o a doua cheie în content map pentru multipart slash form-data. Acest Media Type Object specifică apoi regulile pentru acel mixed payload. Fiecare media type primește propria definiție independentă. Asta permite exact aceluiași API endpoint să proceseze formate de date fundamental diferite, bazate exclusiv pe header-ul Content-Type pe care clientul îl trimite în HTTP request. În interiorul Request Body Object-ului în sine, alături de content map, vei găsi un required flag. Aceasta este o proprietate booleană simplă. Setarea ei pe true înseamnă că request-ul va eșua imediat dacă clientul trimite un empty body. Asta impune prezența payload-ului înainte ca serverul măcar să încerce să valideze datele din interior. Regulile structurale propriu-zise ale payload-ului în sine sunt gestionate de o schemă atașată la Media Type Object, deși mecanica profundă a designului de JSON Schema va fi acoperită în episodul zece. Iată ideea de bază. Request Body Object decuplează raw data payload-ul de HTTP transport parameters, permițând unui singur endpoint să aplice reguli de validare complet diferite, bazate exclusiv pe media type-ul declarat în content map. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
8

Așteptări și erori: Responses

3m 52s

Definirea rezultatelor unui apel API folosind Responses Object. Explorăm maparea codurilor de stare HTTP la structuri specifice de răspuns și soluția de rezervă default response.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 8 din 19. Majoritatea developerilor documentează happy path-ul, dar adevărata reziliență a unui API vine din definirea strictă a modului exact în care lucrurile vor eșua. Dacă le spui clienților doar ce se întâmplă atunci când totul merge perfect, API-ul tău este doar pe jumătate documentat. Astăzi, ne uităm la Expectations și Error Responses. În OpenAPI, răspunsurile servesc drept garanția supremă a contractului. Ele formalizează promisiunea că, dacă clientul trimite un request specific, API-ul va returna un payload cunoscut sau o eroare structurată. Această promisiune este gestionată de Responses Object. Gândește-te la el ca la un routing table pentru rezultate. Cheile din acest map sunt HTTP status codes scrise ca string-uri, cum ar fi textul 200 sau 404. Valorile atașate acestor chei sunt Response Objects individuale, care detaliază exact ce se întoarce la client prin rețea. Iată ideea principală despre formatarea acestor obiecte. În mare parte din OpenAPI, câmpurile description sunt complet opționale. Le folosești atunci când vrei să adaugi un context util pentru alți developeri. Într-un Response Object, câmpul description este strict obligatoriu. Dacă îl omiți, întreaga ta definiție de API devine invalidă. Nu trebuie să fie un paragraf lung. O frază scurtă și precisă care explică rezultatul este suficientă, dar parser-ul îi va impune prezența. Ia în considerare un scenariu practic în care un client face un request pentru un anumit user profile. Pentru rezultatul de succes, definești o cheie pentru string-ul 200. În interiorul acelui Response Object, oferi description-ul obligatoriu, poate scriind Successful user retrieval. Apoi, definești câmpul content. Acest câmp mapează un media type, cel mai frecvent application/json, direct la schema care definește structura de user object. Codul de client știe acum exact la ce proprietăți să se aștepte atunci când apelul are succes. Asta acoperă rezultatul așteptat. Acum trebuie să documentezi eșecul. Sub același Responses Object, definești o altă cheie pentru 404. Câmpul description necesar ar putea fi pur și simplu User not found. La fel ca în cazul de succes, câmpul content de aici mapează application/json la o schemă, dar de data asta indică spre structura ta standardizată de eroare. Datorită acestui contract explicit, aplicația client poate să facă parse în siguranță la error response și să afișeze un prompt util pentru end user, în loc să dea crash la date neașteptate. Vor exista întotdeauna cazuri în care nu poți prezice fiecare error code pe care arhitectura ta l-ar putea produce. Un reverse proxy ar putea arunca un 502 Bad Gateway, sau un web application firewall ar putea injecta un 403 Forbidden. Aici intervine wildcard-ul default. În loc de un HTTP status code numeric, folosești exact cuvântul default drept cheie. Asta acționează ca o definiție catch-all. Dacă serverul returnează orice status code pe care nu l-ai listat explicit în Responses Object, clientul face fall back la structura definită sub default. Acționează ca o plasă de siguranță pentru error handling generic, asigurându-se că clientul știe în continuare cum să citească error payload-ul. O definiție de API cu adevărat robustă nu explică doar scenariul perfect; oferă un map precis și predictibil pentru fiecare mod posibil în care sistemul poate eșua. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
9

Reutilizare cu Components

4m 23s

Păstrarea specificației tale DRY (Don't Repeat Yourself). Descoperă cum să folosești Components Object și Reference Objects ($ref) pentru a partaja definiții în întregul document.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 9 din 19. Dacă API-ul tău are 100 de endpoints și toate returnează exact aceeași structură de paginare, copy-paste-ul este o rețetă pentru dezastru. O mică modificare a numelui unui câmp înseamnă să cauți manual 100 de definiții împrăștiate prin document. Mecanismul structural care rezolvă această problemă este reutilizarea cu Components. Specificația OpenAPI rezolvă problema de spec bloat printr-o secțiune dedicată, la nivel de root, numită Components Object. Gândește-te la el ca la un dicționar centralizat sau o librărie internă pentru definiția API-ului tău. În loc să definești structuri de date complexe, query parameters standard sau răspunsuri repetitive ale serverului inline, sub fiecare path individual, le declari exact o singură dată în interiorul Components Object. Asta stabilește un strict single source of truth. Înainte de a explica mecanismele, trebuie să clarific o concepție greșită des întâlnită despre cum se comportă această secțiune. Definirea unei schema, a unui header sau a unui parametru în interiorul Components Object nu îl expune automat în documentația API-ului sau în logica de routing. Secțiunea components este complet pasivă. Nu are niciun efect direct asupra endpoint-urilor tale. O componentă contează doar dacă un path sau o operațiune reală indică explicit către ea. Pentru a aduce o componentă în serviciu activ, folosești Reference Object. În sintaxa OpenAPI, acesta este reprezentat de cuvântul cheie dollar-sign-ref. Reference Object folosește un JSON Pointer pentru a indica tooling-ului exact unde să localizeze definiția partajată. Un string standard de pointer intern începe cu un simbol hash, urmat de un slash, cuvântul components, un alt slash, numele specific al categoriei și, în final, numele personalizat pe care i l-ai dat obiectului. Hai să transpunem asta într-un scenariu concret. Aproape fiecare API necesită o modalitate consistentă de a returna erorile de client și de server. Vrei ca răspunsurile tale de 400 Bad Request și 500 Internal Server Error să aibă exact aceeași structură pe toate endpoint-urile, conținând poate un error code de tip integer și un string de mesaj descriptiv. Mai întâi, navighezi în jos la Components Object-ul de root. În interiorul acestuia, deschizi o categorie numită schemas. Sub schemas, definești un nou obiect generic numit ErrorModel și specifici proprietățile code și message. Structura ta generică de eroare este acum stocată în siguranță. Apoi, treci la path-urile API-ului. Când definești răspunsul de nivel 400 pentru un endpoint de creare a utilizatorului, omiți complet scrierea proprietăților de schema inline. În schimb, furnizezi o cheie dollar-sign-ref. Valoarea sa este path-ul exact către schema stocată: hash-slash-components-slash-schemas-slash-ErrorModel. Introduci exact același string de referință în răspunsul de nivel 500. Repeți această referință pe endpoint-urile de facturare, endpoint-urile de autentificare și endpoint-urile de căutare. Zeci de operațiuni indică acum spre o singură definiție. Această strategie organizațională se extinde mult dincolo de schemas. Components Object oferă categorii specifice pentru diverse elemente API. Poți stoca argumente standard de paginare în cadrul categoriei parameters. Poți defini structuri întregi de payload în requestBodies, sau cerințe standard de autorizare în securitySchemes. Logica operațională rămâne identică în toate. Definești obiectul o dată în compartimentul corespunzător, apoi îl conectezi la path-urile operaționale folosind o referință. Iată ideea cheie. Construirea unei specificații API ușor de întreținut înseamnă fundamental controlul duplicării. Când apare o nouă cerință care te obligă să adaugi un câmp timestamp la fiecare răspuns de eroare, utilizarea components înseamnă că editezi ErrorModel-ul exact într-un singur loc, iar fiecare operațiune din întregul API moștenește automat actualizarea. Asta e tot pentru acest episod. Pe curând!
10

Tipuri de date și Schemas

4m 10s

Impunerea regulilor pentru date folosind Schema Object. Acoperim integrarea OpenAPI cu JSON Schema Draft 2020-12, formatele de date și tipurile primitive.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 10 din 19. Știi ce este un integer, dar baza ta de date trebuie să știe dacă este o valoare pe 32 de biți sau pe 64 de biți. Schemele acoperă acest gol. Acest episod este în întregime despre tipuri de date și scheme. Schema Object acționează ca un motor riguros de validare pentru API-ul tău. Stă direct la baza parametrilor, a request body-urilor și a răspunsurilor tale. În loc să-i spui unui client să trimită un payload JSON generic, o schemă dictează forma, tipul și limitele exacte ale acelor date. Acționează ca un filtru strict la granița sistemului tău. Dacă un request primit nu corespunde regulilor definite în schemă, pică validarea înainte ca logica aplicației tale măcar să îl vadă. Istoric vorbind, developerii se loveau de un punct major de fricțiune când defineau aceste reguli. OpenAPI versiunea 3.0 folosea propriul dialect customizat de JSON Schema. Era aproape de standard, dar fundamental incompatibil în câteva moduri frustrante, provocând nenumărate dureri de cap legate de tooling. OpenAPI versiunea 3.1 rezolvă complet această problemă. Nu mai este un dialect custom. OpenAPI 3.1 este acum complet aliniat cu JSON Schema modern. Mai exact, acționează ca un superset pentru JSON Schema Draft 2020-12. Asta înseamnă că orice document JSON Schema standard pe care îl ai deja este automat o schemă OpenAPI 3.1 validă. Faptul că este un superset înseamnă pur și simplu că OpenAPI adaugă câteva keyword-uri specifice de API pe deasupra, cum ar fi identificatorii de configurare XML, fără a strica standardul de bază. În centrul acestor reguli de schemă se află keyword-ul type. OpenAPI se bazează pe tipurile de date primitive definite de JSON Schema. Ai string-uri, integer-uri, number-uri și boolean-uri. Distincția dintre number și integer este strict aplicată. Tipul number gestionează valorile floating-point și double-urile, în timp ce tipul integer respinge în mod specific orice are o fracție zecimală. Iată ideea cheie. Să știi că ceva este pur și simplu un string sau un integer este rareori un context suficient pentru un sistem de backend. Aici devine esențial modificatorul format. Keyword-ul format restrânge un tip primitiv larg la ceva specific pentru care codul tău poate aloca memorie sau pe care îl poate valida. Tipul primitiv îi spune parser-ului JSON cum să citească datele brute, iar formatul îi spune aplicației tale exact cum să interpreteze valoarea. De exemplu, dacă definești o proprietate ca integer, poți adăuga un format de int32 sau int64 pentru a specifica dimensiunea exactă în bytes. Dacă tipul tău este un string, poți aplica un format precum date-time, password sau email. Specificația OpenAPI definește un registru standard al acestor formate, dar câmpul este în cele din urmă un open string, ceea ce înseamnă că tooling-ul poate suporta formate custom dacă aplicația ta le necesită. Hai să parcurgem un scenariu concret. Trebuie să definești un obiect User pentru un endpoint de înregistrare. Începi prin a crea o schemă de tip object. În interiorul acestui object, definești două proprietăți, un ID și o adresă de email. Pentru proprietatea ID, setezi tipul la integer și formatul la int64. Pentru proprietatea adresei de email, setezi tipul la string și formatul la email. În final, specifici un array de proprietăți required care conține numele ambelor câmpuri, ID și email. Acum ai un contract strict, executabil. Dacă un client trimite o proprietate email care nu seamănă cu o adresă de email validă, sau un ID care depășește o limită numerică de 64 de biți, API gateway-ul sau framework-ul respinge imediat payload-ul. Precizia la granița API-ului te scutește de scrierea unei logici nesfârșite de verificare a datelor în interiorul controllerelor. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
11

Definirea Security Schemes

4m 23s

Încuierea ușii principale a API-ului tău. Învață cum să configurezi Security Scheme Object pentru chei API, autentificare HTTP (Basic/Bearer) și OAuth2.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 11 din 19. Înainte să poți proteja un endpoint sensibil, trebuie să declari oficial exact cum arată o legitimație validă. Nu poți pur și simplu să ceri autentificarea de la un client. Trebuie să specifici mecanismul exact pe care trebuie să-l folosească, adresele URL pe care trebuie să le acceseze și parametrii pe care trebuie să-i trimită. Definirea de security schemes este modul prin care rezolvi asta. Gândește-te la acest pas ca la o inventariere a încuietorilor care există în sistemul tău. Descrii tipurile de încuietori disponibile, dar încă nu le instalezi efectiv pe nicio ușă anume. În OpenAPI, definești aceste încuietori în interiorul obiectului components, mai exact într-o secțiune numită security schemes. Fiecare încuietoare primește un nume de referință personalizat, la alegerea ta. În interiorul acelui nume personalizat, îi declari proprietatea type și proprietățile necesare. Există cinci tipuri principale de security schemes în specificația OpenAPI 3 punct 1. Primul este tipul http. Acesta acoperă mecanismele standard de autentificare HTTP definite de RFC 7235, cum ar fi autentificarea Basic sau Bearer. Pentru a defini o schemă standard de token HTTP Bearer, creezi o intrare sub security schemes. Setezi proprietatea type la string-ul http și setezi proprietatea scheme la string-ul bearer. De asemenea, poți adăuga opțional o proprietate bearer format pentru a sugera tipul de token, cum ar fi furnizarea string-ului JWT. Iată ideea de bază. Când folosești schema http bearer, specificația presupune implicit că token-ul va fi trimis în header-ul standard HTTP Authorization. Nu îi spui lui OpenAPI unde să caute. Dar al doilea tip, schema api key, este complet diferit. Pentru un API key, trebuie să specifici explicit atât proprietatea name, care este numele exact al câmpului, cât și proprietatea in, care dictează unde merge cheia. Proprietatea in acceptă doar trei valori: query, header sau cookie. Dacă te aștepți la un header custom precum X API Key, folosește tipul api key. Dacă folosești header-e standard Authorization, folosește tipul http. Al treilea tip este oauth2. Acesta necesită o configurare mai structurală, deoarece OAuth2 are mai multe flows distincte. Pentru a defini un flow complex OAuth2 authorization code, începi prin a seta proprietatea type la oauth2. Apoi, furnizezi un obiect flows. În interiorul flows, adaugi un obiect authorization code. Acest obiect imbricat necesită două adrese URL specifice. Furnizezi authorization url unde utilizatorul se loghează, și token url unde aplicația schimbă un cod pentru un token. De asemenea, trebuie să furnizezi un obiect scopes, care mapează nume specifice de scopes la descrieri text scurte ale lucrurilor pe care acele scopes le permit. Al patrulea tip este open id connect. Acesta este mult mai simplu de declarat decât OAuth2. Setezi proprietatea type la open id connect și furnizezi o singură proprietate open id connect url. Aceasta indică direct către acel discovery document binecunoscut pe care clienții îl folosesc pentru a se configura automat. În cele din urmă, al cincilea tip este mutual t l s, care vine de la mutual Transport Layer Security. Pur și simplu setezi proprietatea type la mutual t l s. Asta semnalează că clientul trebuie să furnizeze un certificat X 509 în timpul handshake-ului TLS inițial pentru a se autentifica, complet în afara application layer-ului HTTP. Cea mai utilă concluzie de aici este că definirea de security schemes separă mecanismul de autentificare de endpoint-urile care îl necesită. Îți construiești încuietorile o singură dată într-un catalog centralizat, asigurându-te că clienții știu exact cum să-și formateze credențialele înainte să încerce măcar să bată la ușă. Apropo, dacă vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Îți mulțumesc că m-ai ascultat și spor la construit!
12

Aplicarea Security Requirements

4m 15s

Securizarea operațiunilor tale. Explorăm Security Requirement Object și cum să aplici regulile de autentificare la nivel global sau per rută.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 12 din 19. Aplicarea securității este o chestiune de echilibru: vrei să blochezi întregul seif la nivel global, dar să lași lobby-ul deschis pentru vizitatori. Pentru a face asta fără să te blochezi pe dinafară, trebuie să înțelegi cum aplică OpenAPI Security Requirements. După ce ai definit schemele de securitate în secțiunea components a documentului tău OpenAPI, trebuie să le atașezi efectiv la endpoint-urile tale. Faci acest lucru folosind array-ul security. Acest array conține Security Requirement Objects, care fac referire la numele schemelor pe care le-ai construit anterior. Poți declara acest array security în două locuri: global, la root-ul documentului tău OpenAPI, sau local, în interiorul unui anumit Operation Object. Dacă îl definești la root, absolut fiecare endpoint din API-ul tău moștenește acea cerință. Dacă îl definești în interiorul unei operațiuni, acesta face override complet la configurația globală. Nu face merge cu setările globale, ci le înlocuiește în întregime. Imaginează-ți un scenariu în care setezi o cerință globală ca fiecare rută de API să aibă nevoie de un Bearer token. Asta securizează seiful. Dar ai și o rută de login. Dacă ruta de login moștenește acea cerință globală de token, noii utilizatori nu se pot autentifica niciodată, deoarece nu au încă un token. Trebuie să faci override la blocajul global. O greșeală frecventă este pur și simplu omiterea câmpului security pe operațiunea de login, presupunând că asta implică lipsa securității. Dacă omiți câmpul, operațiunea va folosi implicit cerința globală, iar utilizatorii tăi vor fi blocați pe dinafară. Pentru a permite explicit accesul anonim, trebuie să definești array-ul security pe operațiunea de login și să pui un obiect gol în interiorul lui. Acel obiect gol îi spune lui OpenAPI că cerința pentru a accesa acest endpoint specific este inexistentă. Blocajul global este ocolit, iar vizitatorii pot ajunge în lobby. Aici devine interesant. Modul în care structurezi elementele din array-ul security dictează logica autentificării tale. Aceasta gestionează atât scenarii cu OR logic, cât și scenarii cu AND logic, bazate exclusiv pe object boundaries. Dacă array-ul tău conține două Security Requirement Objects separate, de exemplu, un obiect care solicită un API key și un al doilea obiect separat care solicită OAuth2, asta creează un OR logic. API-ul va accepta un request dacă clientul satisface fie primul obiect, fie pe al doilea. Dacă ai nevoie de un AND logic, schimbi granițele. Să presupunem că un request trebuie să aibă atât un token OAuth2, cât și o custom header signature. Pui ambele nume de scheme într-un singur Security Requirement Object. Deoarece împart același obiect, API-ul cere ca toate să fie valide înainte de a lăsa request-ul să treacă. Când scrii aceste obiecte, mapezi numele schemei tale la un array. Dacă folosești OAuth2 sau OpenID Connect, acel array listează acele scopes specifice necesare pentru operațiune, cum ar fi citirea sau scrierea datelor. Dacă folosești un API key sau o basic HTTP scheme, acele scopes nu se aplică, așa că trebuie să mapezi numele schemei la un array gol pentru a satisface specificația. Structura fizică a array-ului tău security este instrumentul tău principal pentru definirea logicii de acces. Stăpânește diferența de boundaries dintre listarea elementelor în array versus listarea elementelor într-un singur obiect și vei putea construi orice flow de autentificare de care are nevoie sistemul tău. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
13

API-uri asincrone cu Webhooks

3m 49s

Gestionarea cererilor out-of-band. Aprofundează funcționalitatea Webhooks introdusă în OpenAPI 3.1 și înțelege cum diferă de Callbacks tradiționale.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 13 din 19. REST este excelent pentru a pune întrebări, dar ce se întâmplă când API-ul tău trebuie să fie cel care inițiază conversația? API-urile asincrone cu webhooks gestionează acest lucru trimițând date în momentul în care are loc un eveniment, eliminând complet necesitatea de polling constant. În trecut, consumatorii trebuiau să scrie scripturi care verificau în mod repetat endpoint-urile tale pentru a vedea dacă un status s-a schimbat. Acest lucru era ineficient atât pentru serverele lor, cât și pentru ale tale. OpenAPI 3.1 a rezolvat această limitare prin introducerea câmpului webhooks chiar în root-ul documentului OpenAPI. Această adăugare a adus first-class support pentru comunicarea asincronă, event-driven, în specificațiile API standard. În loc să documentezi doar ceea ce un client trimite către serverul tău, câmpul webhooks îți permite să documentezi exact inversul. Definești request-urile HTTP pe care platforma ta le va iniția și trimite către serverul consumatorului. Este necesar să tragem o linie clară între webhooks și callbacks, deoarece specificația OpenAPI le gestionează foarte diferit. Distincția constă în modul în care este înregistrat URL-ul de destinație. Callbacks sunt declanșate de un request API specific, activ. Un client apelează un endpoint de subscription din API-ul tău și furnizează un URL target chiar acolo, în payload-ul request-ului. Deoarece sunt legate de o operațiune, callbacks sunt definite în interiorul acelui operation object specific. Webhooks sunt înregistrate out-of-band. Un developer se loghează într-un dashboard de management, navighează la o pagină de setări și dă paste la URL-ul de destinație într-un formular. Specificației API nu îi pasă cum a fost obținut URL-ul. Deoarece webhooks există independent de orice call API specific de runtime, ele sunt plasate la cel mai înalt nivel al documentului tău OpenAPI, stând chiar lângă paths și components standard. Pentru a documenta un webhook, deschizi map-ul webhooks de la nivelul root. Fiecare cheie din interiorul acestui map este un simplu string care denumește evenimentul. De exemplu, ai putea utiliza string-ul payment dot successful. Valoarea atașată acelei chei este un Path Item Object standard. Aceasta este exact aceeași structură pe care o folosești pentru a defini endpoint-urile tale REST normale. În interiorul acelui Path Item Object, declari metoda HTTP pe care platforma ta o va folosi pentru a livra evenimentul, care este aproape întotdeauna un request POST. Iată ideea cheie. Perspectiva este complet inversată, dar instrumentele rămân identice. Folosești schema objects standard pentru a defini body-ul request-ului pe care platforma ta îl va trimite. În scenariul payment dot successful, specifici că payload-ul va fi un obiect JSON care conține un ID unic de plată, suma exactă facturată și un timestamp. De asemenea, poți defini headers, ceea ce este esențial pentru webhooks, deoarece de obicei trebuie să documentezi un header de semnătură criptografică, astfel încât consumatorul să poată verifica dacă payload-ul a provenit de fapt de la tine. În cele din urmă, documentezi răspunsurile pe care le aștepți înapoi de la consumator. Ai putea preciza că sistemul tău așteaptă un status code 200 OK în termen de trei secunde, altfel sistemul tău va reîncerca livrarea mai târziu. Prin standardizarea acestei documentații API inverse, oferi consumatorilor tot ce au nevoie pentru a genera propriul lor cod de server. Aceștia știu exact ce payload să parseze, ce headers să valideze și ce status codes să returneze. Câmpul webhooks de la nivelul root schimbă designul API-ului de la simple interacțiuni request-response la o arhitectură complet documentată, event-driven. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
14

Tranziții de stare cu Links

4m 08s

Maparea dinamică a fluxurilor de lucru API. Explorăm Link Object pentru a descrie relațiile dintre operațiuni, oferind o abordare pragmatică pentru HATEOAS.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 14 din 19. Crearea unui user este primul pas, dar cum știe un client automat, în mod intuitiv, unde să meargă mai departe pentru a face fetch la acel profil de user? Ai putea să faci hardcode la workflow în codul de client, dar asta se strică în momentul în care structura API-ului tău se schimbă. Soluția pentru asta sunt State Transitions cu Links. În OpenAPI, obiectul Link stă în interiorul unui response și mapează datele din acel response către parametrii altei operațiuni. Ca să fie foarte clar, link-urile nu execută request-uri în mod automat. Ele nu transformă OpenAPI într-un engine activ de orchestrare. Ele oferă pur și simplu instrucțiuni statice pentru tooling-ul, SDK-urile sau documentația ta despre cum să construiești următorul request logic dintr-un workflow. Dacă ai mai construit API-uri până acum, s-ar putea să te gândești că asta sună exact ca un HATEOAS strict, unde serverul trimite link-uri hypermedia dinamice în response payload. Link-urile OpenAPI oferă o alternativă developer-friendly la această abordare. În loc să forțeze backend-ul să injecteze URI-uri dinamice în fiecare response la runtime, link-urile OpenAPI descriu tranzițiile de stare ale workflow-ului în mod static, chiar în interiorul definiției API-ului. Tool-urile de client pot înțelege workflow-ul fără să fie nevoie să facă parse la payload-uri live pentru a descoperi ce acțiuni sunt posibile. Logica funcționează prin conectarea unui source response la o operațiune target. Gândește-te la un request POST standard, folosit pentru a crea un user nou. Response-ul returnează un JSON body care conține un user ID nou generat. În interiorul acelei definiții specifice de response, adaugi un map de link-uri. Fiecare entry din acest map definește o relație cu o altă operațiune, cum ar fi request-ul GET care aduce profilul de user. Identifici operațiunea target folosind unul dintre cele două câmpuri reciproc exclusive. Primul este operation ID, care este un simplu string ce se potrivește cu identificatorul unic al operațiunii target. Al doilea este operation reference, care folște un JSON Pointer standard pentru a naviga prin documentul OpenAPI și a localiza target path-ul și metoda HTTP. Operation ID este în general mai curat dacă API-ul tău le definește consistent, în timp ce operation reference este util pentru a pointa către operațiuni din documente OpenAPI externe. Odată ce pointezi către operațiunea target, trebuie să îi dai datele corecte. Faci asta folosind un parameters map. Cheile din acest map reprezintă numele parametrilor pe care îi așteaptă operațiunea target, cum ar fi path parameter-ul user ID. Valorile sunt runtime expressions care spun tooling-ului de unde să extragă acele date din contextul curent. Un runtime expression este o sintaxă specifică ce evaluează datele în timpul apelului API. Poți scrie o expresie care instruiește clientul să se uite în response body, să localizeze câmpul ID și să îi extragă valoarea. Nu ești limitat la response body. Runtime expressions pot extrage valori din response headers, din request path-ul original sau din query parameters ai request-ului original. Dacă operațiunea target necesită un request body în loc de doar parametri, obiectul Link oferă un câmp request body. Asta îți permite să mapezi un runtime expression direct în payload-ul request-ului următor. Când un SDK generator procesează aceste link-uri, poate crea automat chained method calls, permițând unui developer să creeze un user și să apeleze imediat o metodă generată pentru a face fetch la profil pe obiectul returnat. Iată ideea de bază. Adevărata putere a obiectului Link este că face legătura între endpoint-uri izolate, transformând un dicționar plat de API paths într-o hartă navigabilă de acțiuni pe care clienții tăi le pot urma cu încredere, fără să se bazeze pe URL-uri hardcodate. Îți mulțumesc că m-ai ascultat — ne auzim data viitoare.
15

Documentație interactivă cu Swagger UI

3m 48s

Dând viață specificației tale. Descoperă cum să instalezi și să servești Swagger UI pentru a oferi un portal de documentație interactiv și vizual pentru dezvoltatori.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 15 din 19. O specificație JSON perfect construită este inutilă dacă developerii care consumă API-ul tău refuză să o citească. Trebuie să o faci vizuală. Exact aici intră în joc Interactive Docs cu Swagger UI. Până în acest moment, am tratat un document OpenAPI ca un fișier raw text care conține endpoint-uri și schemas. Swagger UI preia acel fișier JSON sau YAML și îl transformă într-o pagină web interactivă. Acest lucru mută tot focusul de la scrierea specificației la consumarea ei activă. Developerii pot naviga prin endpoint-uri, pot inspecta query parameters și pot executa request-uri HTTP live direct din browserul lor. Acționează ca o punte între un contract static și un tool de testare live. Dacă vrei să hostezi tu însuți această interfață, probabil vei începe cu Node Package Manager. Când vrei să-l instalezi, vei da imediat peste o capcană comună de naming. Există două pachete principale. Primul se numește pur și simplu swagger hyphen ui. Nu-l folosi pe acesta decât dacă rulezi un build tool precum Webpack sau Rollup pentru a compila o aplicație front-end custom. Dacă scopul tău este doar să hostezi documentația direct, ai nevoie de pachetul numit swagger hyphen ui hyphen dist. Sufixul dist vine de la distribution. Conține asset-urile statice pre-built, ready-to-serve, cum ar fi bundle-urile JavaScript de bază, stylesheet-urile CSS și un fișier index HTML. Pui aceste fișiere pe orice web server de bază și funcționează imediat. Dacă nu vrei să gestionezi deloc node packages sau fișiere locale, poți face embed la exact aceleași asset-uri statice într-o pagină web goală folosind un content delivery network precum unpkg. Adaugi un style tag HTML standard care pointează către fișierul CSS Swagger UI de pe unpkg, și un script tag pentru bundle-ul JavaScript. Apoi, scrii un scurt bloc de inițializare în JavaScript care pointează către adresa web unde se află fișierul tău OpenAPI. Browserul încarcă pagina goală, face fetch la asset-uri din rețea, îți recuperează specificația și randează automat interfața completă. Iată ideea principală. Nici măcar nu trebuie să scrii HTML pentru a face deploy la această interfață. Cea mai curată și scalabilă metodă este să folosești imaginea oficială de Docker. Pur și simplu dai pull la imaginea numită swaggerapi slash swagger hyphen ui. Dacă o rulezi direct out of the box, va încărca un exemplu default Petstore. Ca să servești propriul tău fișier local în schimb, îți montezi specificația în container ca un volume. Apoi, pasezi un environment variable numit SWAGGER underscore JSON, pointându-l către calea exactă unde ai montat acel fișier în interiorul containerului. Mai întâi, execuți comanda Docker run și mapezi un port expus, cum ar fi optzeci, la mașina ta locală. Apoi, mapezi directorul tău local care conține fișierul swagger dot json la un director din interiorul containerului. În cele din urmă, setezi environment variable-ul SWAGGER underscore JSON pentru a targeta acel file path intern specific. Când containerul pornește, ridică un web server lightweight, citește environment variable-ul tău pentru a localiza specificația și servește UI-ul. Obții un portal de documentație complet funcțional care rulează în câteva secunde, fără să instalezi nicio dependență locală. Prin decuplarea randării documentației de source code-ul API-ului în sine, Swagger UI transformă un contract text static într-un mediu de testare executabil care rulează perfect pe orice infrastructură. Mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
16

Personalizarea Swagger UI

3m 57s

Adaptarea experienței dezvoltatorului. Aprofundăm configurarea Swagger UI, modificarea opțiunilor de afișare și activarea funcționalităților precum deep linking și syntax highlighting.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 16 din 19. Documentația ta API se încarcă în zece secunde și, de fiecare dată când un inginer vrea să-i arate un anumit endpoint unui coleg, trebuie să scrie manual instrucțiuni despre cum să dea scroll în jos și să-l găsească. Setările default sunt făcute să fie modificate. Hai să modificăm interfața, astfel încât developerii tăi să găsească exact ce au nevoie în milisecunde. Aici este vorba despre customizarea Swagger UI. Înainte să modificăm ceva, trebuie să tragem o linie clară. Setările despre care discutăm nu intră în documentul tău de specificații OpenAPI. Acestea sunt configurări de runtime. Tu modifici interfața care randează documentul, nu documentul în sine. Poți injecta acești parametri în două moduri. Dacă hostezi tu fișierele de UI, pasezi un obiect de configurare în constructorul de Javascript din Swagger UI atunci când se încarcă pagina web. Dacă folosești imaginea oficială de Docker pentru Swagger UI, pasezi exact aceleași proprietăți direct către container, ca environment variables. Cea mai importantă setare îi spune interfeței unde să-ți găsească spec-ul. Dacă ai un singur API, folosești parametrul numit url, la singular, și îi pasezi un path de tip string. Dar dacă ai o arhitectură de microservicii cu mai multe API-uri distincte, folosești parametrul urls, la plural. Îi pasezi un array care conține obiecte, fiecare cu un nume și un link. Asta generează automat un dropdown menu în bara de sus a interfeței, permițând userului să facă switch fără probleme între diferite definiții de API. Acum, gândește-te la un API enterprise masiv, cu sute de path-uri și data models complexe. Dacă Swagger UI încearcă să randeze toate astea pe ecran simultan, browserul va da freeze. Parametrul care controlează asta este docExpansion. Default, este setat pe cuvântul list, care dă expand la toate tag-urile de top-level, dar ascunde detaliile operațiunii. Îl poți schimba în full, ceea ce dă expand la absolut tot de pe pagină. Totuși, ca să salvezi load time pe un API masiv, vrei să setezi docExpansion pe none. Asta forțează interfața să se încarce complet collapsed. Salvează multă memorie și se randează instant, lăsând userul să deschidă doar ce are nevoie cu adevărat. Odată ce userul găsește ce are nevoie, va vrea să dea share. Default, când dai click prin operațiunile din Swagger UI, nu se modifică address bar-ul din browser. Dacă setezi parametrul deepLinking pe true, interfața adaugă un hash fragment la URL de fiecare dată când un user dă expand la un endpoint sau la un tag. Developerii tăi pot copia exact acel URL și îl pot trimite unui coleg, ducându-l precis la o anumită operațiune, în loc de partea de sus a paginii. Iată ideea cheie. Dacă documentația ta există în principal ca să acționeze ca un sandbox, vrei să reduci fricțiunea. În mod normal, un user trebuie să dea click pe un buton numit Try it out pe o operațiune, ca să deblocheze acele input fields. Dacă setezi flag-ul tryItOutEnabled pe true, acele input fields sunt active în momentul în care operațiunea primește expand. Userul poate pur și simplu să tasteze și să dea execute fără acel click în plus. Customizarea Swagger UI la runtime îți oferă puterea să modelezi experiența documentației în jurul intenției userului, transformând o randare generică într-un tool de înaltă performanță, adaptat echipei tale. Mulțumesc pentru ascultare. Aveți grijă de voi, tuturor.
17

Proiectarea cu Swagger Editor

3m 28s

Scrierea definițiilor API cu feedback instantaneu. Explorează funcționalitățile, instalarea și capacitățile de validare în timp real ale clasicului Swagger Editor.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 17 din 19. Să scrii manual spec-uri OpenAPI într-un text editor standard e un coșmar plin de typo-uri și paranteze nealiniate. Ai nevoie de un environment care să țipe la tine în milisecunda în care indentezi greșit un path. Exact asta îți oferă designul cu Swagger Editor. Swagger Editor nu este doar un text box. Este un Integrated Development Environment construit special pentru standardul OpenAPI. Treaba lui principală e să te ajute să faci design, să definești și să documentezi API-ul de la zero. Layout-ul este împărțit. Partea stângă conține codul tău raw YAML sau JSON. Partea dreaptă îți arată documentația interactivă randată. Aici e partea cea mai importantă. Editorul îți validează sintaxa în timp real, pe baza specificației OpenAPI. Dacă scrii greșit numele unui obiect sau uiți un required field, îți semnalează instant eroarea și îți spune exact ce linie e stricată. Nu trebuie să rulezi un build script separat ca să afli că indentarea ta e greșită. Trebuie să clarificăm ceva legat de versiuni. Swagger Editor clasic, cunoscut ca versiunea 4, este un legacy tool. Suportă complet OpenAPI 2.0 și 3.0. Nu este construit nativ pentru OpenAPI 3.1.0. Dacă dai paste la un spec 3.1.0 în editorul clasic, validarea va da fail. Pentru spec-uri 3.1.0 moderne, trebuie să treci la Swagger Editor Next, pe care îl vom acoperi în episodul final. Dar pentru munca standard pe 3.0, editorul clasic rămâne adânc înrădăcinat în multe workflow-uri. Poți folosi editorul clasic direct în browser, fără să instalezi nimic. Totuși, să dai paste la designuri de API proprietare pe un website public e o cale sigură să-ți superi echipa de security. Aici intervine execuția locală. Poți rula Swagger Editor local, pe propria ta mașină. Îl poți instala folosind npm, dând pull la pachetul swagger-editor și pornind un server local. O abordare și mai curată este să folosești Docker. Dai pull la imaginea swaggerapi slash swagger-editor și pornești un container mapat la portul tău local. Asta rulează exact același editor vizual, în întregime pe mașina ta. Acest setup permite echipelor să facă design în siguranță, în spatele unui firewall corporate, fără să expună spec-uri nelansate pe internetul public. Toată validarea în timp real are loc local. Pentru că editorul oferă feedback vizual instant, faci design mai rapid. Îți mapezi path-urile, îți definești acele data models și verifici imediat dacă documentația rezultată are sens. Prinzi greșelile structurale în faza de design, cu mult înainte să scrii logica de backend. Dacă ți se par utile aceste episoade, poți susține emisiunea căutând DevStoriesEU pe Patreon. Cel mai valoros aspect al editorului este încrederea imediată pe care ți-o oferă; un spec fără erori pe ecran garantează că tool-urile tale downstream vor funcționa fără probleme. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
18

Automatizarea cu Swagger Codegen

4m 29s

Transformarea specificațiilor în cod boilerplate. Învață cum Swagger Codegen v3 folosește documentul tău OpenAPI pentru a genera instantaneu server stubs și biblioteci client.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 18 din 19. Ai petrecut ore întregi proiectând specificația perfectă. Acum, privește cum scrie mii de linii de cod de server pentru tine în trei secunde. Asta este recompensa automatizării cu Swagger Codegen. În primul rând, trebuie să clarificăm o capcană comună de versioning. Swagger Codegen versiunea doi suportă exclusiv specificațiile mai vechi Swagger 2.0. Dacă folosești standardul modern OpenAPI 3.0, trebuie să folosești Swagger Codegen versiunea trei. Acest episod se concentrează în întregime pe versiunea trei. Swagger Codegen este un engine bazat pe template-uri care citește documentul tău OpenAPI și construiește automat codul aplicației. El îți traduce fișierele de design în clase, interfețe și operațiuni de rețea reale. Asta este recompensa supremă a dezvoltării design-first. În loc să scrii manual sute de fișiere boilerplate pentru HTTP routing, parameter parsing și object models, lași mașina să se ocupe de munca repetitivă. Generatorul produce două tipuri principale de cod. În primul rând, construiește client SDK-uri. Dacă ai nevoie de un client de Python, JavaScript sau Go care să comunice cu API-ul tău, Codegen creează o librărie ready-to-use. Pachetul de client gestionează automat HTTP requests, URL formatting și response parsing. Developerii de frontend sau alte echipe de microservicii pot pur și simplu să importe această librărie generată și să apeleze metodele nativ, în loc să scrie manual network requests. În al doilea rând, generează server stubs. Un server stub este shell-ul structural al aplicației tale de backend. Acesta include API routing, data models și layerele de input validation. Conectează totul astfel încât serverul să poată porni și să asculte trafic imediat. Codul generat interceptează HTTP requests primite, validează payload-ul pe baza schemei tale OpenAPI și transmite datele curate către o funcție goală. Singura ta sarcină ca developer este să completezi acele funcții goale cu business logic-ul tău real, cum ar fi database queries sau calcule. Hai să vedem cum rulezi efectiv chestia asta. Swagger Codegen este de obicei executat printr-o interfață command-line folosind un fișier Java archive. Deschizi terminalul și rulezi comanda Java cu flag-ul dash jar, indicând fișierul swagger-codegen-cli dot jar. Îi dai comanda generate. Apoi, oferi trei flag-uri esențiale. Folosești dash i pentru a specifica input file-ul tău, cum ar fi openapi dot yaml. Folosești dash l pentru a seta limbajul și framework-ul target. De exemplu, dacă îi pasezi spring, îi spui tool-ului să construiască o aplicație Java Spring Boot. În cele din urmă, folosești dash o pentru a specifica output directory-ul target. Execuți comanda. În câteva secunde, tool-ul parsează specificația. Mapează fiecare string, integer și array definite în documentul tău OpenAPI la tipurile native echivalente din Java. Se bazează pe o librărie de logic templates pre-construite pentru framework-ul target, ca să îmbine aceste tipuri. Rezultatul este o structură completă de directoare, plină de controllers, configuration files și data classes. Poți compila imediat acel output directory, poți porni serverul și poți apela cu succes endpoint-urile pe care le-ai proiectat. Iată ideea cheie. Code generation-ul nu economisește doar timp la început. Generând structura de server și librăriile de client direct din același fișier OpenAPI, garantezi că implementarea se potrivește perfect cu contractul tău, reducând la zero erorile de integrare dintre echipe. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
19

Viitorul: Swagger Editor Next

3m 57s

Îmbrățișarea evoluției designului API. Introducem Swagger Editor Next, arhitectura sa și suportul său puternic pentru OpenAPI 3.1 și specificația AsyncAPI.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. OpenAPI și Swagger Ecosystem, episodul 19 din 19. API-urile REST nu mai sunt singura modalitate prin care sistemele comunică. E timpul pentru un tool care înțelege Kafka și arhitecturile event-driven la fel de bine ca HTTP. Acel tool este Swagger Editor Next. Cunoscut și ca versiunea 5, acesta este un rebuild complet al interfeței standard cu care probabil ești deja familiarizat. Swagger Editor clasic este strâns legat de API-uri HTTP sincrone și de tehnici de randare mai vechi. Funcționează bine pentru OpenAPI 3.0, dar se poate bloca sau poate avea lag la validarea fișierelor excepțional de mari. Swagger Editor Next înlocuiește acea infrastructură învechită. Este construit în întregime pe un stack modern de React și Webpack. Asta e partea care contează. Text input-ul din spate este acum susținut de Monaco Editor. Este exact aceeași tehnologie care stă la baza Visual Studio Code. Pentru că se bazează pe Monaco, Swagger Editor Next gestionează fișiere masive de specificații fără să se blocheze. Oferă un syntax highlighting robust, detectare imediată a erorilor și o validare precisă la nivel de linie care pur și simplu depășește versiunea clasică. Practic, tastezi într-un IDE lightweight, mai degrabă decât într-un web form. Asta acoperă partea de engine. Dar specificațiile propriu-zise? Swagger Editor Next aduce două capabilități native majore. În primul rând, suportă OpenAPI 3.1.0 out of the box. Această versiune specifică de OpenAPI se aliniază complet cu JSON Schema, ceea ce înseamnă că poți construi modele de date mult mai complexe și componente reutilizabile decât puteai în versiunea 3.0. În al doilea rând, Swagger Editor Next randează nativ specificațiile AsyncAPI. Asta este calea definitivă de urmat pentru developerii care gestionează microservicii event-driven, alături de API-urile tradiționale. AsyncAPI folosește o structură foarte similară cu OpenAPI, dar în loc să definească path-uri HTTP și request-uri GET, documentează message brokers, topic-uri și evenimente asincrone. Pentru a vedea cum funcționează asta în practică, uită-te la o rețea smart city care gestionează iluminatul stradal. Dacă ai avea doar tool-uri pentru REST, ai putea încerca să forțezi un endpoint HTTP POST să reprezinte un stream constant de date de la senzori. Cu Swagger Editor Next, pur și simplu scrii un document AsyncAPI. Definești un channel numit smart-city-streetlights. Setezi Kafka ca protocol. Apoi, specifici o operațiune de publish care detaliază structura JSON exactă pe care o emite senzorul atunci când se aprinde o lumină. Pe măsură ce tastezi specificația în partea stângă a ecranului, Monaco Editor validează sintaxa AsyncAPI. În partea dreaptă, interfața randează un document vizual structurat și interactiv. Acesta afișează clar topic-urile Kafka, payload-urile mesajelor așteptate și header-ele protocolului. Nu mai ai nevoie de toolchain-uri separate pentru API-urile sincrone și microserviciile event-driven. Ecosistemul a evoluat pentru a le gestiona pe amândouă simultan. Trecerea către evenimente asincrone nu înseamnă să începi de la zero cu documentația; necesită doar un editor modern capabil să citească aceste noi standarde. Întrucât asta încheie seria noastră, ia-ți un moment să citești documentația oficială, să încarci Swagger Editor Next și să încerci să modelezi singur un topic Kafka. Dacă ai o idee pentru o serie complet nouă, vizitează devstories dot eu și spune-ne. Cam atât pentru episodul ăsta. Ne auzim data viitoare!