🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Java Spring
  3. Documentación Spring REST Docs
Extrait - Java Spring La base técnica de las aplicaciones Jakarta EE
Extractos del libro
Java Spring La base técnica de las aplicaciones Jakarta EE Volver a la página de compra del libro

Documentación Spring REST Docs

Introducción

Las aplicaciones se abren e interconectan cada vez más. Exponen y comparten sus estados a través de interfaces que, hoy en día, a menudo tienen forma de API REST con microservicios. Estas interfaces deben estar documentadas para facilitar el acceso a nuestras aplicaciones.

La documentación de las API públicas de LinkedIn, Facebook, Twitter, Google está particularmente bien hecha y algunas veces se compara con la documentación de nuestras API internamente, lo que nos impulsa a dedicar una cantidad considerable de tiempo para mantener la documentación clara, precisa y actualizada.

Para responder a esta necesidad, Spring ofrece una librería Spring REST Docs que se puede utilizar para crear documentación automática para los servicios REST. Esta posibilidad complementa a herramientas como Swagger (estática y dinámica) con SpringFox y el HAL Browser que, por ejemplo, muestran cómo funcionan los servicios.

La librería se basa en Asciidoctor y extractos de documentación para generar automáticamente, durante la compilación, texto plano o HTML.

Asciidoctor es muy potente para crear documentación.

También es posible generar Markdown (archivo *.md), que es muy práctico para usar en GitLab o GitHub, por ejemplo. La librería se utiliza junto con librerías de pruebas como jUnit y TestNG. La librería utiliza las pruebas para generar la documentación de extracción para las consultas y respuestas. Documenta las API basándose en la ejecución de pruebas, lo que garantiza que la API esté actualizada y que los ejemplos que muestra funcionen.

La documentación se centra en los recursos del servicio REST y detalla, por un lado, las consultas HTTP que consume la API y, por otro lado, las respuestas que produce, manteniendo oculta la parte de implementación.

En las siguientes secciones usaremos Maven, pero también es posible hacer el equivalente con Gradle. Del mismo modo, solo veremos parcialmente la documentación generada, ya que es muy completa. El ejemplo del capítulo permite ver rápidamente la documentación generada.

La librería de generación de documentos se inyecta en las pruebas. Podemos obtener resultados significativamente diferentes en función de las librerías de pruebas...

Ejemplo JUnit 5 (Jupiter)

La documentación del ejemplo se genera en el directorio target/generated-snippets. Sería posible especificar otro directorio.

Código de mockMvc

El mock es el que utiliza Spring REST Docs para generar la documentación. Es relativamente complejo. Lo ideal es usar el ejemplo que está disponible para su descarga y seguir las instrucciones.

private MockMvc mockMvc; 
 
@ExtendWith(RestDocumentationExtension.class) 
  public class JUnit5ExampleTests { 
 
  private MockMvc mockMvc; 
 
  @BeforeEach 
  public void setUp(WebApplicationContext webApplicationContext, 
  RestDocumentationContextProvider restDocumentation) { 
    this.mockMvc = 
       MockMvcBuilders.webAppContextSetup(webApplicationContext) 
         .apply(documentationConfiguration(restDocumentation)) 
         .build(); 
} 

Llamada de servicio:

this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)) 
  .andExpect(status().isOk()) 
  .andDo(document("index")); 

Durante las builds, la herramienta genera extractos que son plantillas reutilizables. A continuación, podemos personalizar estos extractos:

  • <output-directory>/index/curl-request.adoc...

Consulta y respuesta

En el archivo request-description.adoc, se genera el cuerpo de la consulta predeterminada.

El de la respuesta, en response-description.adoc.

Para un Body:

{ 
  "contact": { 
    "name": "Jane Doe", 
    "email": "jane.doe@example.com" 
  } 
} 

Lo podemos configurar de la siguiente manera:

this.mockMvc.perform(get("/user/5") 
.accept(MediaType.APPLICATION_JSON)) 
  .andExpect(status().isOk()) 
  .andDo(document("index", 
  responseFields( 
    fieldWithPath("contact.email") 
    .description("The user's email address"), [...] 

La consulta se presenta en forma de tabla, que tiene como extracto el archivo request-fields.adoc.

También podemos usar rutas JSON.

Asimismo, es posible especificar el tipo del campo a través del tipo (Object) de la clase FieldDescriptor.

.andDo(document("index", 
  responseFields( 
  fieldWithPath("contact.email").type(JsonFieldType.STRING) 
    .description("The user's email address")))); 

Respuesta con JSON anidado

Podemos tener una respuesta con un JSON anidado.

Para una descripción como esta:

{ 
  "weather": { + 
    "wind": { + 
    "speed": 15.3, + 
    "direction": 287.0 + 
   }, 
  "temperature": { 
    "high": 21.2, 
    "low": 14.8 
    } 
  } 
} 

Podemos tener este código:

this.mockMvc.perform(get("/locations/1").accept(MediaType. 
APPLICATION_JSON)) + 
.andExpect(status().isOk()).andDo(document("location", + 
responseBody(beneathPath("weather.temperature")))); 
 
Identificador : beneath-$\{path}. 
 
Snippet : response-description-beneath-weather.temperature.adoc 

Código:

responseBody(beneathPath("weather.temperature") 
.withSubsectionId("temp")); 

Documentación de los campos:

this.mockMvc.perform(get("/locations/1").accept(MediaType. 
APPLICATION_JSON)) + 
.andExpect(status().isOk()) + 
.andDo(document("location", + 
responseFields(beneathPath("weather.temperature"), + 
fieldWithPath("high").description( + 
"The forecast high in degrees celcius"), + 
fieldWithPath("low") + 
.description("The forecast low in degrees celcius")))); 

1. Parámetros de consulta

Utilizamos el método...

Personalización de la documentación

Es posible tener en cuenta las restricciones de datos (validadores) para completar la documentación y personalizar las consultas y las respuestas para que coincidan exactamente con la API. Hay un ejemplo entre los ejemplos descargables que muestra estas posibilidades.

Uso de @AutoConfigureRestDocs

Esta anotación se puede aplicar a una clase de prueba para habilitar y configurar la generación automática de documentos Spring REST. Permite configurar el directorio de salida, el esquema y el puerto de los URI generados. Cuando se requiere una configuración adicional, se puede usar un bean RestDocsMockMvcConfigurationCustomizer.

Acoplamiento Swagger 2

Vimos que la documentación estática era necesaria y fácil de hacer con Spring y que podíamos usar el navegador HAL para exponer las API. También es posible utilizar Swagger 2. Esta sección describe dos usos de Swagger 2 en proyectos de Spring: uso estándar con Swagger 2 y un uso más avanzado con SpringFox.

Swagger permite una generación estática en tiempo de compilación y SpringFox permite una generación dinámica en tiempo de ejecución. Algunas veces usamos ambos juntos.

1. Utilizar Springfox

Como alternativa a la solución estudiada, vamos s ver cómo utilizar la implementación Springfox en nuestro proyecto de ejemplo.

http://springfox.github.io/springfox/docs/current/

El proyecto Springfox automatiza la documentación de las API JSON para las API creadas con Spring.

Dependencia Maven:

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

Esta clase de configuración se utiliza para configurar Springfox:

@Configuration ...

Uso con Spring Data Rest

Podemos usar Springfox con Spring Data Rest. Es suficiente con importar los modelos a través de la anotación @Import. En los ejemplos descargables, puede consultar el código completo, que resulta demasiado extenso para reproducirlo en su totalidad aquí.

Configuración de Java:

@Import(\{ ... 
springfox.documentation.spring.data.rest.configuration.SpringDataRest 
Configuration.class, 
...}) 
 
@Import(\{ ... 
springfox.bean.validators.configuration.BeanValidatorPlugins 
Configuration.class, 
...}) 

Por lo tanto, el uso es sencillo y es posible personalizar muchos elementos en la página swagger de la documentación de la aplicación.

Resumen de la documentación generada

Spring REST Docs se puede utilizar para generar documentación estática para un proyecto. Permite tener una documentación actualizada. Adicionalmente, también se puede utilizar Asciidoctor para generar otras partes de la documentación o para compartir elementos entre varias documentaciones, como documentación de las API, documentación del proyecto o manual de usuario.

Puntos clave

  • Spring REST Docs se puede utilizar para generar la documentación estática de un proyecto.

  • Adicionalmente, también se puede utilizar Asciidoctor para generar otras partes de la documentación o para compartir elementos entre varias documentaciones, como documentación de las API, documentación del proyecto o manual de usuario.

  • Con estas herramientas, es posible tener documentación de estilo profesional sin dedicarle demasiado tiempo.