SpringBoot
Tutorial SpringBoot: Open API y cómo agregarlo en Spring Boot
Spring Boot OpenAPI: documentación de API. Aprende a documentar APIs en Spring Boot utilizando OpenAPI con ejemplos prácticos.
Aprende SpringBoot GRATIS y certifícateQué es Open API y cómo se agregar en Spring Boot 3
OpenAPI es una especificación estándar para describir interfaces de programación de aplicaciones (API) RESTful. Su principal objetivo es facilitar la comunicación entre diferentes sistemas mediante una descripción clara y estructurada de los endpoints, métodos, parámetros y respuestas que una API ofrece. Al adoptar OpenAPI, los desarrolladores pueden generar documentación interactiva, realizar pruebas automatizadas y asegurar la consistencia entre los distintos entornos de desarrollo.
Integrar OpenAPI en una aplicación Spring Boot 3 implica varios pasos que optimizan la gestión y el mantenimiento de las API. Para comenzar, es necesario añadir las dependencias pertinentes en el archivo build.gradle
o pom.xml
. Por ejemplo, utilizando Maven, se incluiría la dependencia de springdoc-openapi-ui
:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>2.3.0</version>
</dependency>
Una vez configuradas las dependencias, Spring Boot detecta automáticamente las clases controladoras y genera la documentación correspondiente basada en las anotaciones existentes.
Adicionalmente, Spring Boot 3 permite acceder a la interfaz de usuario de OpenAPI mediante una URL específica, generalmente http://localhost:8080/swagger-ui.html
o http://localhost:8080/swagger-ui/index.html
.
Esta interfaz proporciona una representación visual interactiva de la API, facilitando la exploración y prueba de los endpoints directamente desde el navegador.
Ejemplo:
Diferencias entre Open API y Swagger
OpenAPI y Swagger son términos que a menudo se utilizan de manera intercambiable, pero representan conceptos distintos dentro del ecosistema de desarrollo de APIs.
Mientras que OpenAPI se refiere a una especificación estándar para describir APIs RESTful, Swagger es un conjunto de herramientas que implementan esta especificación.
La especificación OpenAPI define un formato estructurado para describir las funcionalidades de una API, incluyendo sus endpoints, métodos HTTP, parámetros, respuestas y esquemas de datos. Esta especificación facilita la comunicación y la colaboración entre desarrolladores, permitiendo una comprensión clara y unificada de cómo funciona una API.
Al adoptar OpenAPI, los equipos pueden generar automáticamente documentación, realizar pruebas y asegurar la consistencia entre diferentes entornos y versiones de la API.
Por otro lado, Swagger es el ecosistema de herramientas que facilita la implementación y el uso de la especificación OpenAPI. Incluye componentes como Swagger Editor, Swagger UI y Swagger Codegen. Swagger UI, por ejemplo, proporciona una interfaz gráfica interactiva que permite a los desarrolladores explorar y probar los endpoints de una API directamente desde el navegador. Esta interfaz se integra fácilmente con aplicaciones Spring Boot 3, permitiendo una visualización dinámica de la documentación generada a partir de las definiciones OpenAPI.
Una diferencia clave radica en que OpenAPI es una especificación pública mantenida por la OpenAPI Initiative, mientras que Swagger originalmente fue desarrollado por la empresa Swagger, que más tarde fue adquirida por SmartBear. Aunque Swagger sigue siendo una parte integral del ecosistema de OpenAPI, su rol principal es proporcionar las herramientas necesarias para trabajar con la especificación.
Además, en versiones recientes, Swagger ha ampliado su funcionalidad para incluir características avanzadas como la generación de código cliente y servidor a partir de las definiciones OpenAPI. Esto permite a los desarrolladores acelerar el proceso de creación de aplicaciones al generar automáticamente los esqueletos de código basados en la especificación de la API.
Anotaciones de Open API para usar en controladores y DTOs
El uso de anotaciones de OpenAPI en controladores y DTOs (Data Transfer Objects) es fundamental para enriquecer la documentación de las APIs y garantizar una claridad en la comunicación de los contratos entre el servidor y los clientes. Estas anotaciones permiten especificar detalles precisos sobre los endpoints, los parámetros esperados y las estructuras de datos utilizadas, lo que facilita tanto el desarrollo como el consumo de la API.
En los controladores, se emplean principalmente anotaciones como @Operation
, @ApiResponse
y @Parameter
. La anotación @Operation
se utiliza para describir la operación que realiza un endpoint específico, proporcionando un resumen y una descripción detallada de su funcionalidad. Por ejemplo:
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/productos")
public class ProductoController {
@Operation(
summary = "Obtener lista de productos",
description = "Retorna una lista paginada de todos los productos disponibles en el sistema."
)
@ApiResponse(responseCode = "200", description = "Lista de productos obtenida exitosamente")
@GetMapping
public List<Producto> obtenerProductos(
@Parameter(description = "Página que se desea obtener", example = "0")
@RequestParam(defaultValue = "0") int pagina,
@Parameter(description = "Número de elementos por página", example = "10")
@RequestParam(defaultValue = "10") int tamaño) {
// Lógica para obtener productos
}
}
En este ejemplo, @Operation
proporciona un resumen y una descripción de la operación, mientras que @ApiResponse
especifica la respuesta esperada. Las anotaciones @Parameter
detallan cada uno de los parámetros de la petición, mejorando la comprensión de cómo interactuar con el endpoint.
Por otro lado, en los DTOs, se utilizan anotaciones como @Schema
para definir la estructura y las restricciones de los datos que se intercambian. Esto asegura que la documentación refleje con precisión los modelos de datos utilizados. Por ejemplo:
import io.swagger.v3.oas.annotations.media.Schema;
public class ProductoDTO {
@Schema(description = "Identificador único del producto", example = "12345", required = true)
private Long id;
@Schema(description = "Nombre del producto", example = "Smartphone XYZ", maxLength = 100, required = true)
private String nombre;
@Schema(description = "Descripción detallada del producto", example = "Smartphone con 128GB de almacenamiento", maxLength = 500)
private String descripcion;
@Schema(description = "Precio del producto", example = "499.99", minimum = "0", required = true)
private BigDecimal precio;
// Getters y setters
}
En este caso, @Schema
define cada campo del DTO, especificando descripciones, ejemplos y restricciones como maxLength
o minimum
. Esto no solo mejora la generación de la documentación, sino que también facilita la validación de los datos en tiempo de ejecución.
Además de estas anotaciones básicas, existen otras como @ApiResponse
, que permite definir múltiples respuestas posibles para un mismo endpoint, y @RequestBody
, que describe el cuerpo de la solicitud en operaciones que lo requieran. La combinación adecuada de estas anotaciones en controladores y DTOs resulta en una documentación precisa y detallada, que refleja fielmente el comportamiento y las expectativas de la API.
Es importante destacar que, al utilizar estas anotaciones, se favorece la mantenibilidad del código y la coherencia en la documentación, ya que cualquier cambio en los controladores o en los modelos de datos se refleja automáticamente en la especificación OpenAPI generada. Asimismo, herramientas como Swagger UI se benefician de esta riqueza de información para proporcionar interfaces interactivas que facilitan la exploración y prueba de los endpoints.
Finalmente, es recomendable seguir las mejores prácticas al aplicar estas anotaciones, asegurando que cada endpoint y cada DTO estén debidamente documentados y que las descripciones sean claras y concisas. De esta manera, se potencia la calidad de la API y se facilita tanto su uso por parte de desarrolladores como su mantenimiento a lo largo del ciclo de vida del proyecto.
Configuración del @Bean de Open API
Para personalizar la configuración de OpenAPI en una aplicación Spring Boot 3, es esencial definir un bean específico que permita ajustar diversos aspectos de la documentación generada automáticamente. Este enfoque proporciona un control detallado sobre la información presentada, mejorando la claridad y usabilidad de la API para los consumidores.
En primer lugar, es necesario crear una clase de configuración marcada con la anotación @Configuration
. Dentro de esta clase, se declara el método que devuelve una instancia de OpenAPI
. Este método está anotado con @Bean
, lo que indica a Spring que debe gestionar este objeto como un componente del contexto de la aplicación.
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("API de Gestión de Productos")
.version("2.0")
.description("Esta API permite gestionar productos en el inventario.")
.contact(new Contact()
.name("Soporte Técnico")
.email("soporte@ejemplo.com")))
.components(new Components()
.addSecuritySchemes("BearerAuth",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")));
}
}
En el ejemplo anterior, la configuración del bean de OpenAPI incluye la personalización de la información básica de la API mediante el objeto Info
. Aquí se especifica el título, la versión, una descripción detallada y los datos de contacto del responsable de la API. Esta información es fundamental para que los usuarios comprendan el propósito y el respaldo de la API.
Además, se configuran los componentes de seguridad utilizando la clase Components
. En este caso, se añade un esquema de seguridad de tipo HTTP Bearer con formato JWT. Esta configuración es esencial para definir cómo se autenticarán las solicitudes a la API, proporcionando una capa adicional de seguridad y asegurando que solo los usuarios autorizados puedan acceder a los recursos.
Es posible extender esta configuración para incluir otros aspectos, como Servers
, que definen los entornos donde está desplegada la API, o Tags
, que permiten agrupar los endpoints de manera lógica. A continuación, se presenta un ejemplo de cómo añadir estos elementos adicionales:
@Bean
public OpenAPI extendedOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("API de Gestión de Productos")
.version("2.0")
.description("Esta API permite gestionar productos en el inventario.")
.contact(new Contact()
.name("Soporte Técnico")
.email("soporte@ejemplo.com")))
.servers(List.of(
new Server().url("https://api.ejemplo.com/v2").description("Servidor de Producción"),
new Server().url("https://staging.api.ejemplo.com").description("Servidor de Staging")))
.components(new Components()
.addSecuritySchemes("BearerAuth",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")))
.addTagsItem(new Tag().name("Productos").description("Operaciones relacionadas con productos"))
.addTagsItem(new Tag().name("Usuarios").description("Operaciones relacionadas con usuarios"));
}
En este segundo ejemplo, se añaden dos servidores diferentes, uno para el entorno de Producción y otro para Staging, facilitando la gestión de distintos entornos de despliegue. Además, se incluyen dos tags: uno para las operaciones relacionadas con Productos y otro para Usuarios, lo que organiza de manera más coherente los endpoints en la documentación generada.
Es importante también considerar la integración de global responses y external documentation para enriquecer aún más la especificación de la API. Por ejemplo:
@Bean
public OpenAPI comprehensiveOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("API de Gestión de Productos")
.version("2.0")
.description("Esta API permite gestionar productos en el inventario.")
.contact(new Contact()
.name("Soporte Técnico")
.email("soporte@ejemplo.com")))
.components(new Components()
.addSecuritySchemes("BearerAuth",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT"))
.addResponses("NotFound", new ApiResponse().description("Recurso no encontrado"))
.addResponses("Unauthorized", new ApiResponse().description("No autorizado")))
.externalDocs(new ExternalDocumentation()
.description("Documentación Adicional")
.url("https://docs.ejemplo.com"))
.addSecurityItem(new SecurityRequirement().addList("BearerAuth"))
.addTagsItem(new Tag().name("Productos").description("Operaciones relacionadas con productos"));
}
En este fragmento de código, se definen respuestas globales como NotFound
y Unauthorized
, que pueden ser referenciadas en múltiples endpoints, reduciendo la redundancia en las descripciones de las respuestas de error. Además, se integra una documentación externa que proporciona recursos adicionales para los desarrolladores que deseen profundizar en ciertos aspectos de la API.
La correcta configuración del @Bean de OpenAPI no solo mejora la calidad de la documentación generada, sino que también facilita el mantenimiento y la evolución de la API a lo largo del tiempo. Al centralizar la configuración en un único punto, se asegura la coherencia en toda la especificación y se simplifica la incorporación de nuevas características o ajustes necesarios.
Es recomendable revisar periódicamente la configuración del bean de OpenAPI para adaptarla a los cambios en los requerimientos de la API y asegurar que la documentación permanezca actualizada y precisa. De esta manera, se garantiza que los consumidores de la API tengan acceso a información fiable y útil, optimizando la experiencia de desarrollo y reduciendo posibles malentendidos o errores en la integración.
Ejercicios de esta lección Open API y cómo agregarlo en Spring Boot
Evalúa tus conocimientos de esta lección Open API y cómo agregarlo en Spring Boot con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
API Query By Example (QBE)
Identificadores y relaciones JPA
Borrar datos de base de datos
Web y Test Starters
Métodos find en repositorios
Controladores Spring MVC
Inserción de datos
CRUD Customers Spring MVC + Spring Data JPA
Backend API REST con Spring Boot
Controladores Spring REST
Uso de Spring con Thymeleaf
API Specification
Registro de usuarios
Crear entidades JPA
Asociaciones en JPA
Asociaciones de entidades JPA
Integración con Vue
Consultas JPQL
Open API y cómo agregarlo en Spring Boot
Uso de Controladores REST
Repositorios reactivos
Inyección de dependencias
Introducción a Spring Boot
CRUD y JPA Repository
Inyección de dependencias
Vista en Spring MVC con Thymeleaf
Servicios en Spring
Operadores Reactivos
Configuración de Vue
Entidades JPA
Integración con Angular
API Specification
API Query By Example (QBE)
Controladores MVC
Anotaciones y mapeo en JPA
Consultas JPQL con @Query en Spring Data JPA
Repositorios Spring Data
Inyección de dependencias
Data JPA y Mail Starters
Configuración de Angular
Controladores Spring REST
Configuración de Controladores MVC
Consultas JPQL con @Query en Spring Data JPA
Actualizar datos de base de datos
Verificar token JWT en peticiones
Login de usuarios
Integración con React
Configuración de React
Todas las lecciones de SpringBoot
Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Spring Boot
Introducción Y Entorno
Spring Boot Starters
Introducción Y Entorno
Inyección De Dependencias
Introducción Y Entorno
Controladores Spring Mvc
Spring Web
Vista En Spring Mvc Con Thymeleaf
Spring Web
Controladores Spring Rest
Spring Web
Open Api Y Cómo Agregarlo En Spring Boot
Spring Web
Servicios En Spring
Spring Web
Clientes Resttemplate Y Restclient
Spring Web
Rxjava En Spring Web
Spring Web
Crear Entidades Jpa
Persistencia Spring Data
Asociaciones De Entidades Jpa
Persistencia Spring Data
Repositorios Spring Data
Persistencia Spring Data
Métodos Find En Repositorios
Persistencia Spring Data
Inserción De Datos
Persistencia Spring Data
Actualizar Datos De Base De Datos
Persistencia Spring Data
Borrar Datos De Base De Datos
Persistencia Spring Data
Consultas Jpql Con @Query En Spring Data Jpa
Persistencia Spring Data
Api Query By Example (Qbe)
Persistencia Spring Data
Api Specification
Persistencia Spring Data
Repositorios Reactivos
Persistencia Spring Data
Introducción E Instalación De Apache Kafka
Mensajería Asíncrona
Crear Proyecto Con Apache Kafka
Mensajería Asíncrona
Creación De Producers
Mensajería Asíncrona
Creación De Consumers
Mensajería Asíncrona
Kafka Streams En Spring Boot
Mensajería Asíncrona
Introducción A Spring Webflux
Reactividad Webflux
Spring Data R2dbc
Reactividad Webflux
Controlador Rest Reactivo Basado En Anotaciones
Reactividad Webflux
Controlador Rest Reactivo Funcional
Reactividad Webflux
Operadores Reactivos Básicos
Reactividad Webflux
Operadores Reactivos Avanzados
Reactividad Webflux
Cliente Reactivo Webclient
Reactividad Webflux
Introducción A Spring Security
Seguridad Con Spring Security
Seguridad Basada En Formulario En Mvc Con Thymeleaf
Seguridad Con Spring Security
Registro De Usuarios
Seguridad Con Spring Security
Login De Usuarios
Seguridad Con Spring Security
Verificar Token Jwt En Peticiones
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Spring Web
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Reactiva Spring Webflux
Seguridad Con Spring Security
Autenticación Y Autorización Con Anotaciones
Seguridad Con Spring Security
Testing Unitario De Componentes Y Servicios
Testing Con Spring Test
Testing De Repositorios Spring Data Jpa
Testing Con Spring Test
Testing Controladores Spring Mvc Con Thymeleaf
Testing Con Spring Test
Testing Controladores Rest Con Json
Testing Con Spring Test
Testing De Aplicaciones Reactivas Webflux
Testing Con Spring Test
Testing De Seguridad Spring Security
Testing Con Spring Test
Testing Con Apache Kafka
Testing Con Spring Test
Integración Con Angular
Integración Frontend
Integración Con React
Integración Frontend
Integración Con Vue
Integración Frontend
Objetivos de aprendizaje de esta lección
- Comprender la importancia de OpenAPI (anteriormente conocido como Swagger) para la documentación de APIs REST en proyectos Spring Boot, y cómo facilita la interacción y comprensión sin necesidad de acceso al código fuente.
- Aprender a crear un proyecto Spring Boot con la dependencia de Spring Web y cómo añadir manualmente la dependencia de OpenAPI en el archivo
pom.xml
. - Entender cómo desarrollar un controlador básico en Spring Boot que exponga endpoints REST, devolviendo tanto cadenas de texto simples como objetos de clases personalizadas.
- Familiarizarse con el proceso de arranque de un proyecto Spring Boot con OpenAPI integrado y cómo acceder a la documentación de la API y probar los endpoints a través de la interfaz de usuario de Swagger.
- Reconocer la diferencia entre Swagger y OpenAPI, entendiendo que Swagger se refiere al conjunto de herramientas de código abierto para trabajar con la especificación OpenAPI, la cual describe APIs RESTful de manera estándar y neutral.