/core/publish-openapi
Deze regel schrijft voor dat elke api een /openapi.json
file moet publiceren zodat tooling hier gebruik van kan maken.
Hiermee kunnen tools zoals Swagger UI automatisch documentatie websites bouwen en kunnen er TypeScript types worden gegenereerd.
Dit alles zorgt ervoor dat een API inzichtelijk is, maar ook makkelijk te gebruiken voor eindgebruikers
Waarom moet dit bestandje publiekelijk beschikbaar zijn?
API's zijn niet per definitie open, vanwege gevoelige data die zij exposen of vanwege het enforceren van rate limits.
Hierdoor zijn API's niet altijd bereikbaar voor eenieder.
Toch stelt deze regel dat het /openapi.json
bestand wel altijd bereikbaar moet zijn, zonder authenticatie en autorisatie.
De bovengenoemde tooling is de grootste reden hiervoor: als de specificatie altijd beschikbaar is, kunnen afnemers hier gebruik van maken. Denk bijvoorbeeld aan CI systemen die geen productie toegang moeten hebben tot een API, maar wel de TypeScript types willen genereren. Of dat developers eerst de documentatie willen doorlezen, voordat ze beslissen of ze een API key willen aanvragen.
Het beschikbaar maken van de /openapi.json
voor iedereen en op een standaard locatie zorgt ervoor dat afnemers hier tooling omheen kunnen bouwen, zonder dit voor elke API anders af te handelen.
Vanwege deze vraag naar uniformiteit is dit dus gestandaardiseerd.
Implementeren in code
Afhankelijk van het framework van de server die de API host zijn er meerdere oplossingen.
- Gin (Go)
- Quarkus (Java)
Gin heeft een Fizz handler die automatisch de endpoints configureert [source]:
import (
"fmt"
"github.com/gin-gonic/gin"
cors "github.com/rs/cors/wrapper/gin" // hiermee voldoe je aan /core/open-api
"github.com/wI2L/fizz"
"github.com/wI2L/fizz/openapi"
)
func NewRouter() (\*fizz.Fizz, error) {
g := gin.Default()
f := fizz.NewFromEngine(g)
infos := &openapi.Info{
Title: "<title>",
Description: `<description>`,
Version: "<version>",
}
f.GET("/openapi.json", []fizz.OperationOption{
fizz.WithoutSecurity(),
}, cors.default(), f.OpenAPI(infos, "json"))
}
Quarkus heeft een openapi plugin die automatisch een openapi.json
kan genereren op basis van Java annotations. Voeg hiervoor de volgende plugin toe:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-openapi</artifactId>
</dependency>
In de application.properties
moet het volgende worden toegevoegd:
# Sta alle systemen toe om de `/openapi.json` resource op te vragen
quarkus.http.cors=true
quarkus.http.cors.origins=*
# De gestandaardiseerde locatie van het bestandje
quarkus.smallrye-openapi.path=/openapi.json
# Zodat authentication niet nodig is om de `/openapi.json` resource op te vragen
quarkus.smallrye-openapi.auto-add-security=false
Het is ook mogelijk om een statisch bestandje in src/main/resources/META-INF/openapi.json
te zetten en deze automatisch te laten serven. De plugin zal het bestandje automatisch uitbreiden met de relevante resources op basis van de Java annotations.