Proč dokumentovat API pomocí OpenAPI/Swagger
OpenAPI (dříve Swagger Specification) je de facto standardem pro strojově čitelnou specifikaci REST/HTTP API. Jediný zdroj pravdy (specifikační soubor) slouží jako základ pro generování dokumentace, SDK klientů, serverových stubů, validaci požadavků a odpovědí, testování i mockování. Správně navržená OpenAPI specifikace snižuje náklady na integrace, zvyšuje konzistenci a urychluje onboarding vývojářů i partnerů.
Terminologie: OpenAPI vs. Swagger
- OpenAPI Specification (OAS): formát specifikace (verze 3.0/3.1), otevřený standard pod Linux Foundation.
- Swagger: původní název specifikace a sada nástrojů (Swagger UI, Swagger Editor, Swagger Codegen).
- OAS 3.1 vs. 3.0: OAS 3.1 je plně kompatibilní s JSON Schema (2020-12), podporuje webhooky, vylepšené nullable/default a přesnější sémantiku pro
oneOf/anyOf/allOf.
Struktura specifikace OAS 3.x
- openapi: verze specifikace (např.
3.1.0). - info: metadata API (název, verze, kontakt, licence).
- servers: základní URL a proměnné prostředí.
- paths: jednotlivé koncové body a operace (GET/POST/… ).
- components: znovupoužitelné části (schemas, responses, parameters, requestBodies, headers, securitySchemes).
- security: globální požadavky na autorizaci.
- tags a externalDocs: organizace a odkazy.
- webhooks (OAS 3.1): zpětná volání iniciovaná serverem.
Minimální příklad v YAML
openapi: 3.1.0
info:
title: Fakturační API
version: 1.2.0
servers:
- url: https://api.example.com/v1
paths:
/invoices:
get:
summary: Seznam faktur
tags: [Invoices]
parameters:
- in: query
name: page
schema:
type: integer
minimum: 1
default: 1
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/InvoicePage"
components:
schemas:
Money:
type: object
properties:
currency:
type: string
pattern: "^[A-Z]{3}$"
amount:
type: number
multipleOf: 0.01
required: [currency, amount]
Invoice:
type: object
properties:
id:
type: string
format: uuid
total:
$ref: "#/components/schemas/Money"
status:
enum: [DRAFT, SENT, PAID, VOID]
required: [id, total, status]
InvoicePage:
type: object
properties:
items:
type: array
items:
$ref: "#/components/schemas/Invoice"
nextPage:
type: integer
nullable: true
Modelování dat pomocí JSON Schema
OAS 3.1 nativně využívá JSON Schema. To umožňuje přesné vyjádření datových typů, omezení a validačních pravidel:
- Kombinátory:
oneOf,anyOf,allOf,not. - Discriminátor pro polymorfismus s explicitním směrováním na konkrétní schémata.
- Formáty (
email,uuid,date-time) a vlastní rozšíření vocabulary.
Vehicle:
oneOf:
- $ref: "#/components/schemas/Car"
- $ref: "#/components/schemas/Truck"
discriminator:
propertyName: type
Car:
type: object
properties:
type:
const: "car"
doors:
type: integer
minimum: 2
required: [type, doors]
Parametry, těla požadavků a obsah
- parameters:
in: path|query|header|cookie, různé styly serializace (form, spaceDelimited, pipeDelimited, deepObject). - requestBody: multimediální obsah (
content) sschemaaexamplespro různé MIME typy. - responses: mapování stavových kódů (včetně
default),headersalinks(HATEOAS).
/invoices/{id}:
get:
parameters:
- in: path
name: id
required: true
schema:
type: string
format: uuid
responses:
"200":
description: Detail faktury
content:
application/json:
schema:
$ref: "#/components/schemas/Invoice"
"404":
$ref: "#/components/responses/NotFound"
components:
responses:
NotFound:
description: Nenalezeno
content:
application/problem+json:
schema:
type: object
properties:
type:
type: string
format: uri
title:
type: string
status:
type: integer
const: 404
detail:
type: string
Bezpečnost a autorizace
- securitySchemes: OAuth2 (authorizationCode, clientCredentials, deviceCode), mTLS, API klíče v hlavičce/parametru/cookie, HTTP Basic/Bearer.
- scopes: jemnozrnná oprávnění pro operace/domény.
- globální vs. lokální definice bezpečnostních požadavků (sekce
securityna rootu vs. u jednotlivých operací).
components:
securitySchemes:
oauth:
type: oauth2
flows:
authorizationCode:
authorizationUrl: https://idp.example.com/auth
tokenUrl: https://idp.example.com/token
scopes:
invoices.read: Čtení faktur
invoices.write: Zápis faktur
security:
- oauth: [invoices.read]
Verzování a životní cyklus API
- Semantic Versioning v
info.versiona/nebo vservers.url(/v1vs./v2). - Deprecation: pole
deprecated: trueu operací, parametrů nebo schémat; dokumentujte náhrady. - Stavové štítky: experimental, beta, ga pomocí
x-*rozšíření.
Refaktorizace a znovupoužití pomocí $ref
Specifikaci rozdělte do více souborů a referencujte relativními URI. Používejte $ref v rámci components i paths. Uvědomte si, že v místě $ref nesmí být sourozenecké klíče (s výjimkou OAS 3.1 při použití $dynamicRef v rámci JSON Schema).
components:
schemas:
Address:
$ref: "./schemas/common.yaml#/Address"
Stylistika a konzistence
- REST konvence: zdrojové podstatné názvy v množném čísle (
/invoices), hierarchická struktura (/customers/{id}/invoices). - HTTP sémantika: idempotentní metody (GET/PUT/DELETE), bezpečné GET (bez vedlejších efektů), použití
PATCHs JSON Patch/Merge Patch. - Chybové odpovědi: konzistentní formát (např.
application/problem+json), relevantní 4xx/5xx kódy a korelační ID.
Dokumentační UX: příklady, popisy a „try it out“
- summary a description pište výstižně; uvádějte obchodní kontext a okrajové případy.
- examples na úrovni
contentischema; zahrňte happy path i chybové scénáře. - Swagger UI / Redoc: generuje přehlednou dokumentaci s vyhledáváním, trvalými odkazy a interaktivním testováním.
content:
application/json:
schema:
$ref: "#/components/schemas/Invoice"
examples:
sample:
summary: Jednoduchá faktura
value:
id: "0c8c…"
status: "PAID"
total:
currency: "CZK"
amount: 1520.00
Mockování, testování a kontrakt-first přístup
- Mock server z OAS pro paralelní vývoj UI a backendu.
- Contract testing (např. v CI): validace, zda implementace odpovídá specifikovaným schématům (request/response validators v API bráně).
- Generované testy: ze
examplesaschemaslze odvodit smoke testy i negativní testy.
Automatizace v CI/CD: linting, bundling a publikace
- Linting: pravidla pro styl, názvosloví, kódy chyb a bezpečnost (např. požadavek na
operationId, zákaz typů „any“). - Bundling: sloučení více souborů do jednoho artefaktu pro publikaci (developerský portál, gateway).
- Validace: syntaktická i sémantická (např. konfliktní cesty, chybějící odpovědi).
- Publikace: automatické nasazení do portálu, verze dokumentace dle verze API.
Generování kódu: klienti, servery a typy
- SDK (TypeScript/Java/C#/Python/Go…): s typovou bezpečností, interceptory pro autorizaci a retry mechanizmy.
- Serverové stuby s předpřipraveným routováním, validací a skeletony handlerů.
- Typování: generované typy s přesnou sémantikou (discriminátory, unie) pro frontend i backend.
Hypermedia a navigace: links a callbacks
- links: popis návazností odpověď → další požadavek (např. z
orderIdna/orders/{id}). - callbacks: server iniciuje volání na předem registrovaný klientský endpoint (např. event dokončení platby).
responses:
"201":
description: Vytvořeno
links:
GetInvoice:
operationId: GetInvoice
parameters:
id: "$response.body#/id"
Vícemediální obsah a verze schémat
- content negotiation: podpora různých formátů (
application/json,application/xml,text/csv). - Binary/stream:
type: stringsformat: binarypro stahování/nahrávání souborů, omezení velikosti přes hlavičky. - Kompatibilita: pečlivé používání
additionalPropertiesaunevaluatedProperties(JSON Schema) pro forward kompatibilitu.
Dokumentace pro interní vs. externí uživatele
- Interní: detailní popis chování, interní chybové kódy, operativní poznámky, runbooky a limity rychlosti.
- Externí: jasné scénáře použití, rychlý start (API klíče/OAuth flow), vzorové požadavky a sandbox prostředí.
- Verzované portály: možnost přepínat dokumentaci podle verzí a prostředí (produkce/stage/sandbox).
Design pro výkon, škálování a spolehlivost
- Idempotentní operace s
Idempotency-Keypro POST metody, bezpečné opakování požadavků. - Stránkování (cursor/offset), filtrování a třídění; popsat limity a deterministické výsledky.
- Rate limiting a hlavičky (
Retry-After,X-RateLimit-*); doporučit strategie backoff.
Mezinárodní prostředí a lokalizace
- i18n: popis časových zón, formátů dat (
date-timev UTC), číselných formátů a měn. - Jazyky dokumentace: možnost přepínání jazyků portálu; překlady
descriptiona příkladů.
Nejčastější chyby v OpenAPI a jak se jim vyhnout
- Chybějící operationId (znesnadňuje generování SDK a vazby mezi operacemi).
- Nekonzistentní kódy chyb, směšování doménových a technických chyb.
- Přetížení query parametrů místo využití strukturovaného
requestBody. - Nedostatečné examples, chybějící okrajové případy a ukázky chybových odpovědí.
- Používání free-form objektů bez omezení, které poškozuje kompatibilitu API.
Šablona redakčního workflow dokumentace
- Návrh rozhraní (kontrakt-first) – definice zdrojů, operací, schémat a chyb.
- Revize – technická (architekti), produktová (produktový manažer), bezpečnostní (IAM/infosec).
- Lint a validace – automatické kontroly stylu, názvosloví, soul