Документування RESTful API в Spring за допомогою специфікації Open API

pic

YouTube посібник

youtube tutorail

Вступ

Open API (раніше Swagger) — це найпоширеніший у світі стандарт опису API, який надає формальну специфікацію для опису HTTP API.

Це дозволяє людям зрозуміти, як працює API і як послідовність API взаємодіє між собою.

Специфікація є машиночитною, тому ми можемо генерувати клієнтський код, створювати тести і багато іншого...

Специфікація Open API має широке застосування, тому користується підтримкою великої кількості постачальників та інструментів.

Історія

Swagger запропонував специфікацію для опису RESTful API.

Ця специфікація створює RESTful інтерфейс для зручної розробки та використання API, ефективно відображаючи всі ресурси та операції, пов'язані з ним.

Специфікація Swagger була прийнята індустрією і стала стандартом, відомим як специфікація OPEN API.

Специфікація базується на кількох принципах:

  • Специфікація повинна бути написана у форматах JSON або YAML.
  • Вона призначена для опису RESTful API.
  • Мета — зробити специфікацію машиночитною.
  • Однак також потрібно зробити її зрозумілою для людей.

Swagger також створив Swagger-ui — популярний веб-інтерфейс користувача для відображення та взаємодії з кінцевими точками.

pic

swagger.io

Ключові моменти в історії специфікації:

  • 2010 — Swagger
  • 2014 — Open API 2.0
  • 2017 — Open API 3.0
  • 2019 — springdoc-openapi
  • 2021 — Open API 3.1

Spring doc — Open API

springdoc-openapi — це бібліотека, яка дозволяє автоматично генерувати документацію Open API для ваших проектів на Spring.

Вона надає інтерфейс користувача Swagger з переліком ваших кінцевих точок та можливістю генерувати JSON-специфікацію Open API.

Бібліотека доступна як залежність в залежності від того, чи використовуєте ви фреймворки webMvc або webflux, а також чи потрібна вам лише генерація специфікації Open API, чи також інтерфейс користувача Swagger.

pic

У нашому випадку проекту, де використовується фреймворк webMvc, ми хочемо мати можливість генерувати як специфікацію API, так і відображати інтерфейс користувача Swagger, тому ми додали стартер webmvc-ui.


 2.7.0  


 org.springdoc  
 springdoc-openapi-starter-webmvc-ui  


 ${springdoc.version}  

Інтеграція "з коробки"

З коробки бібліотека Spring Doc — Open API інтегрована з рештою екосистеми Spring, і лише додавши бібліотеку як залежність до нашого проекту, ми отримаємо з коробки багатий функціонал.

Для демонстрації можливостей бібліотеки ми створили проект, який має наступні стартери:

webMvc

підтримка веб-додатків, включаючи REST, за допомогою Spring MVC

actuator

вбудовані (або кастомні) кінцеві точки, що дозволяють моніторити та керувати вашим додатком — такі як здоров'я додатку, метрики, сесії тощо.

Spring Data JPA

підтримка збереження даних за допомогою Java Persistence API

validations

підтримка валідації бінів

Ми можемо сказати бібліотеці springdoc-openapi, щоб вона сканувала пакети або включала шляхи з нашого додатку в специфікацію Open API двома способами.

Або вказавши властивості в нашому application.properties:

# Пакети для сканування  
springdoc.packagesToScan=com.package1, com.package2
# Шляхи для включення  
springdoc.pathsToMatch=/v1, /api/balance/**

або програмно, визначивши бін GroupedOpenApi:

@Bean  
public GroupedOpenApi publicApi() {  
 return GroupedOpenApi.builder()  
 .group("springshop-public")  
 .pathsToMatch("/public/**")  
 .build();  
}

Spring @RestControllers

Ми отримаємо визначення нашого API, просто використовуючи стандартні анотації Spring webMvc та вказавши пакет для сканування бібліотеці springdoc-openapi.

Наприклад, визначення класу:

@RestController  
@RequestMapping("/api/v1/email")  
public class EmailApiController implements EmailApi {  

 @Override  
 @PostMapping  
 public ResponseEntity sendEmail(@RequestBody @Valid EmailRequest emailRequest) {  
 return ResponseEntity.ok(new EmailResponse("message-id", "Queued.  

Дякую."));  
 }  

 @Override  
 @GetMapping("/{id}")  
 public ResponseEntity checkStatus(@PathVariable String id) {  
 return ResponseEntity.ok(id);  
 }  

 @GetMapping("/filter")  
 public Page  

Ми покажемо всі кінцеві точки, які надає actuator, і змінемо стандартний кореневий URL для actuator з _/actuator_ на _/management_.

springdoc.show-actuator=true
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/management
```

У нашому додатку на Spring специфікація Open API за замовчуванням доступна за адресою: /v3/api-docs, а Swagger UI за адресою: /swagger-ui/index.html

pic

Spring Data JPA

Деякі вбудовані об'єкти фреймворку Spring Data JPA, такі як Page і Pageable, автоматично доступні в описі схеми.

Для визначення методу:

Page  

/api/v1/…​` і не має стандартного веб-інтерфейсу, ми можемо відобразити Swagger за замовчуванням на кореневому URL, встановивши властивість:

Відкриває Swagger UI на базовому URL

springdoc.swagger-ui.use-root-path=true
```

Налаштування визначення REST API

Додавши анотації springdoc-openapi до визначень наших класів і методів, наприклад:

  • @Operation
  • @ApiResponse
  • @RequestBody
  • …​

ми можемо додатково налаштувати, як описано наше API в Open API і Swagger UI.

Особливо корисною є частина @RequestBody content, де ми можемо використовувати @ExampleObject, щоб надати користувачам валідний приклад JSON для негайного тестування нашого API.

Приклад налаштування методу:

@Operation(summary = "надсилає email", tags = {"email"}  
 , description = """  
 надсилає email на адресу  

 з темою  

 і текстом  
 """)  
@ApiResponses(value = {  
 @ApiResponse(responseCode = "200", description = "email успішно надіслано",  
 content = @Content(schema = @Schema(implementation = EmailRequest.class)  
 , examples = @ExampleObject(value = """  
 {  
 "id": "message-id",  
 "message": "Queued. Thank you."  
 }  
 """)))  
})  
ResponseEntity sendEmail(  
 @RequestBody(  
 description = "email повідомлення",  
 content = @Content(examples = @ExampleObject(value = """  
 {  
 "to": "[email protected]",  
 "subject": "тестовий лист",  
 "text": "Ласкаво просимо на наш сайт!"  
 }  
 """)))  
 EmailRequest emailRequest);

pic

Посилання на GitHub:
https://github.com/kanezi/springdoc-openapi-showcase

Перекладено з: Documenting RESTful APIs in Spring with Open API spec

Leave a Reply

Your email address will not be published. Required fields are marked *