Configurar Swagger para documentar un API REST en Spring Boot

La buena experiencia del usuario es clave para usar cualquier producto, y lo mismo ocurre con las API. Cuanto mejor sea la interfaz que se utiliza para consumir API, mayores serán las posibilidades de lograr sus objetivos comerciales y tecnológicos.

¿Por qué es importante la documentación?

Es una de las piezas básicas que determinan la experiencia de un desarrollador al hacer uso de tus servicios API, y va más allá del formato de respuesta API o el método de autentificación .La documentación debe ser interactiva, mostrando a los desarrolladores la estructura y la organización que les facilitará el trabajo, de modo que no tengan que pasar tiempo investigando las funciones o perderlo en pruebas totalmente improductivas.

Primer paso: Incluir las dependencias.

Nuestras dependencias las debemos incluir dentro del archivo principal del proyecto de Spring.

Para un proyecto maven ve al archivo poom.xml y agrega las siguientes lineas:

       <dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
       </dependency>

       <dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
       </dependency>

Si estás utilizando Gradle ve al archivo build.gradle y agrega las siguientes lineas:

implementation 'io.springfox:springfox-swagger2:2.9.2'

implementation 'io.springfox:springfox-swagger-ui:2.9.2'

Siguiente paso: Crear la configuración.

Vamos a crear una nueva clase con el nombre SwaggerConfig. La configuración de Swagger se centra principalmente en el bean Docket.

Agregamos las anotaciones de configuración y la libreria de Swagger2:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

}

Construimos el bean que va a retornar el Docket (spring fox documentation) .

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .securitySchemes(Arrays.asList(apiKey()))
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ejemplo.web.controller"))
                .build();
    }
}

Después de definir el bean Docket , su método select () devuelve una instancia de ApiSelectorBuilder, que proporciona una forma de controlar los puntos finales expuestos por Swagger. Dentro del método apis() agregamos el path que apunta a nuestros Controller que contienen los servicios expuestos.

Vamos a verificar

Para este momento ya podríamos verificar que Springfox está funcionando, podemos visitar esta URL en nuestro navegador:

http: // localhost: 8080 / spring-security-rest / api / swagger-ui.html

El resultado debería verse así:

Como se observa en las imagenes anteriores ya podemos ver cada uno de los métodos implementados en nuestro proyecto, e incluso nos da ejemplos de lo que se espera que reciba y responda cada uno de ellos. Podemos ver que Springfox ha generado las especificaciones para la entidad Product con métodos HTTP como GET , POST, PUT, PATCH y DELETE. Swagger también nos provee un pequeño cliente donde podemos probar y ejecutar las peticiones, facilitando las pruebas de los métodos expuestos.

Bonus: Modificando las vistas de Swagger

Podemos personalizar las vistas de nuestros métodos desde cada Controller, veamos.

@RestController
@RequestMapping("/products")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("/all")
    @ApiOperation("Get all supermarket products")
    @ApiResponse(code = 200, message = "OK")
    public ResponseEntity&lt;List&lt;Product&gt;&gt; getAll() {
        return new ResponseEntity&lt;&gt;(productService.getAll(), HttpStatus.OK);
    }

    @GetMapping("/{id}")
    @ApiOperation("Search a product with an ID")
    @ApiResponses({
            @ApiResponse(code = 200, message = "OK"),
            @ApiResponse(code = 404, message = "Product not found"),
    })
    public ResponseEntity&lt;Product&gt; getProduct(@PathVariable("id") int productId) {
        return productService.getProduct(productId)
                .map(product -&gt; new ResponseEntity&lt;&gt;(product, HttpStatus.OK))
                .orElse(new ResponseEntity&lt;&gt;(HttpStatus.NOT_FOUND));
    }
	
}

La anotación de @ApiOperation nos permite agregar una descripción al método expuesto en Swagger y la @ApiResponse nos permite modificar los mensajes de respuesta del servicio según el estatus HTTP.

Con esto la documentación de nuestra API debería cambiar, el resultado debería ser el siguiente:

Vemos como cada método tiene una pequeña descripción adelante que fue añadida desde el Controller con el @ApiOperation, además observamos que las respuestas del método han sido personalizadas.

Conclusión

En este artículo, configuramos Swagger 2 para generar documentación para una API REST de Spring boot. También exploramos formas de visualizar y personalizar la salida de Swagger. 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *