¿Qué es Swagger?

Swagger es una suite de herramientas para diseñar, construir, documentar y utilizar APIs. Facilita la creación de especificaciones OpenAPI, las cuales definen cómo se estructuran las API. Swagger permite a los desarrolladores y a las organizaciones gestionar el ciclo de vida completo de una API.

Una imagen de ejemplo:

¿Cómo probar Swagger?

Tenemos varias formas de probar Swagger y el uso es igual en todos. Lo que tienen en común es que se usan desde plantillas YAML, que más adelante veremos un ejemplo.

  • A traves de su web: Swagger tiene una web llamada editor.swagger.io donde puedes probar las plantillas que crees. Este editor online te permite visualizar y validar tus especificaciones OpenAPI en tiempo real. Simplemente copia y pega tu plantilla YAML en el editor y verás una representación gráfica en la parte derecha.
  • Con contenedor Docker: Tenemos la posibilidad de instalarlo con docker-compose que es la opción veremos en el post.


Instalación de Swagger usando Docker-compose

Como ya sabremos, para estas pruebas necesitaremos tener instaldo docker y docker-compose.
La estructura del proyecto lo podemos definir de la siguiente manera:

|-- docker-compose.yml
|-- README.md
|-- swagger.yml
|-- /swagger
    |-- ejemplo1.yaml
    |-- ejemplo2.yaml


Puedes clonar o descargar la repo desde GitHub en:

https://github.com/Pistatxos/swaggerDocker

También puedes copiar el código de ejemplo.

Ejemplo plantilla básica

version: '3'
services:
  swagger-ui:
    image: swaggerapi/swagger-ui:latest
    container_name: "swagger-ui"
    ports:
      - "8880:8080"
    volumes:
      - ./swagger/swagger.yaml:/swagger.yaml
    environment:
      SWAGGER_JSON: /swagger.yaml
      VALIDATOR_URL: "" # Lo añadimos para que no salga el cartel de invalid.

Ejemplo plantilla con desplegable para poder usar varios swagger.

  version: '3'
services:
  swagger-ui:
    image: swaggerapi/swagger-ui:latest
    container_name: "swagger-ui"
    ports:
      - "8880:8080"
  volumes:
    - ./swagger:/usr/share/nginx/html/swagger
  environment:
    URLS_PRIMARY_NAME: "API Ejemplo 1"
    URLS: '[{"name": "API Ejemplo 1", "url": "/swagger/ejemplo1.yaml"}, {"name": "API Ejemplo 2", "url": "/swagger/ejemplo2.yaml"}]'
    VALIDATOR_URL: ""

Para añadir cualquiera de los dos ejemplos a una red docker existente:

  ## Dentro del servicio swagger-ui
  networks: # En caso de tener una network
      - network_que_tengamos

## En caso de tener una network o querer usarlo con nginx para poner contraseña.
networks:
  network_que_tengamos:
    external: true

Añadiremos dentro de la carpeta swagger las plantillas, por ejemplo: plant1.yaml y plant2.yaml.

Ejemplo de plantilla Swagger

Adjunto la plantilla con varios ejemplos para que sea más fácil a la hora de crear vuestra nueva plantilla.

openapi: 3.0.0
info:
  title: API Ejemplo
  description: |-
    <p align="right">
      <img src="https://tomonota.net/wp-content/uploads/2024/08/Logo-Tomonota-Negro-e1723131211126.png" alt="LOGO" />
    </p>
    Descripción de la api...

    Gracias a: [TomoNota](https://tomonota.net)

    Tenemos varios ejemplos de uso de la plantilla.
      - Para documentar.
      - Y presentar.

    **Espero os sea de ayuda**

  version: 1.0.0

servers:
  - url: https://tu.dominio.com
    description: Servidor de prueba

tags:
  - name: grupo1
    description: Consultas a la base de datos.

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer

security:
  - BearerAuth: []

paths:

  /recursoEjemplo:
    get:
      tags:
        - grupo1
      summary: Comentario linea método get.
      description: Descripción de la consulta get.
      responses:
        '200':
          description: Respuesta correcta.
        '400':
          description: Datos incorrectos.
        '500':
          description: Error en el servidor.

    post:
      tags:
        - grupo1
      summary: Comentario linea método post
      description: Descripción método post.
      operationId: consultarRegistros
      parameters:
        - name: username
          in: query
          required: true
          schema:
            type: string
          example: "texto ejemplo"
          description: Descripción ejemplo.
        - name: varios
          in: query
          required: true
          schema:
            type: string
            enum: [varios1, varios2, varios3]
          description: Ejemplo con desplegable.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name_test:
                  type: string
                  example: "ejemplo"
                name_test2:
                  type: string
                  example: "ejemplo2"
      security:
        - BearerAuth: []                
      responses:
        '200':
          description: | 
            Existen varias posibilidades para esta respuesta:
            - Se puede organizar un poco el texto.
              - De varias maneras.
            - Como en este:
              - Ejemplo texto.
        '400':
          description: Datos incorrectos.
        '500':
          description: Error en el servidor.

    put:
      tags:
        - grupo1
      summary: Comentario linea método put.
      description: Descripción método put.
      parameters:
        - name: username
          in: query
          required: true
          schema:
            type: string
          example: "texto ejemplo"
          description: Descripción ejemplo.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name_test:
                  type: string
                  example: "ejemplo"
                name_test2:
                  type: string
                  example: "ejemplo2"
      security:
        - BearerAuth: []
      responses:
        '200':
          description: Respuesta correcta.
        '400':
          description: Datos incorrectos.
        '500':
          description: Error en el servidor.

    delete:
      tags:
        - grupo1
      summary: Comentario linea método delete.
      description: Descripción método delete.
      parameters:
        - name: username
          in: query
          required: true
          schema:
            type: string
          example: "texto ejemplo"
          description: Descripción ejemplo.
      security:
        - BearerAuth: []
      responses:
        '200':
          description: Respuesta correcta.
        '400':
          description: Datos incorrectos.
        '500':
          description: Error en el servidor.

Configurando en nginx y opción de añadir autentificación

En el post de Nginx Docker: Enlace – Nginx con Docker tenemos ejemplos para poder establecer una contraseña de acceso. Seguro que te va bien si quieres proteger el acceso, además de poder añadir un SSL y así conectar de manera segura.

Siguiendo los ejemplos del post podrás configurar y probar tus APIs utilizando Swagger y Docker-compose, facilitando la gestión y documentación de tus servicios de manera eficiente, tu trabajo resaltará!

Espero que os sirva de ayuda.

Salu2!

Deja una respuesta

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