Chapitre API RESTful avec Quarkus
Intégrateur OpenAPI avec Quarkus
Le but de cet exercice d'intégrer OpenAPI avec notre backend Quarkus.
Dernière modification : Dec 08 , 2024
Pré-requis
Avant de commencer cet exercice, assurez-vous d'avoir les éléments suivants installés sur votre système :
- JDK 11 ou supérieur
- Apache Maven
- Un éditeur de texte ou une IDE Java (comme Eclipse, IntelliJ IDEA, ou Visual Studio Code)
Étapes
Nous allons suivre la documentation de lien.
Nous avons besoin d'ajouter l'extension quarkus-smallrye-openapi
à notre projet.
quarkus extension add quarkus-smallrye-openapi
Nous pouvons alors tester après redémarrage de l'application, l'URL fournissant le schéma OpenAPI.
̀Ouvrez votre navigateur à l'URL http://localhost:8080/q/openapi.
L'UI pour Swagger est disponible à cette adresse http://localhost:8090/q/swagger-ui/.
Documenter l'API REST
Créer une classe avec le code suivant :
package app;
import jakarta.ws.rs.core.Application;
import org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition;
import org.eclipse.microprofile.openapi.annotations.info.Contact;
import org.eclipse.microprofile.openapi.annotations.info.Info;
import org.eclipse.microprofile.openapi.annotations.info.License;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
@OpenAPIDefinition(
tags = {
@Tag(name="adoption", description="Adoption operations."),
@Tag(name="communication", description="Communication/marketing services")
},
info = @Info(
title="Adoption/Communication API",
version = "1.0.0",
contact = @Contact(
name = "Example API Support",
url = "http://exampleurl.com/contact",
email = "techsupport@example.com"),
license = @License(
name = "Propriétaire",
url = "https://www.monsteradoption.com"))
)public class ExampleApiApplication extends Application {
}
Documenter les ressources REST :
package adoption.rest;
import adoption.domain.AdoptionRepository;
import adoption.domain.Monster;
import jakarta.inject.Inject;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
import org.jboss.resteasy.reactive.ResponseStatus;
@Path("/adoptions")
@Tag(name = "adoption")
@Produces(MediaType.APPLICATION_JSON)
public class AdoptionResource {
@Inject
AdoptionRepository adoptionRepository;
@Operation(
summary = "Get all monsters",
description = "Get all monsters without pagination"
)
@GET
public MonsterView getAllMonsters() {
return new MonsterView(adoptionRepository.getAllMonsters());
}
@Operation(
summary = "Find a monster by uuid",
description = "Returns a monster by uuid"
)
@GET
@Path("/{id}")
public Monster getMonsterByUuid(String id) {
return adoptionRepository.getMonsterByUuid(id);
}
@Operation(
summary = "Search for a monster by name",
description = "Search for a monster by name"
)
@GET
@Path("/search/{name}")
public MonsterView searchMonstersByName(String name) {
return new MonsterView(adoptionRepository.searchMonstersByName(name));
}
@Operation(
summary = "Submit a new adoption",
description = "Submit a new adoption for a monster"
)
@POST
public Monster createMonster(Monster monster) {
adoptionRepository.addMonsterToAdopt(monster);
return monster;
}
@Operation(
summary = "Remove a monster from adoption",
description = "Remove a monster from adoption"
)
@DELETE
@Path("/{id}")
@ResponseStatus(204)
public void deleteMonsterById(String id) {
adoptionRepository.deleteMonsterByUuid(id);
}
@Operation(
summary = "Update a monster from adoption",
description = "Update a monster from adoption"
)
@PUT
@Path("/{id}")
public Monster updateMonsterById(String id, Monster monster) {
return adoptionRepository.updateMonsterByUuid(id, monster);
}
}