«1. Введение

В этой статье мы будем использовать проекты Swagger Codegen и OpenAPI Generator для создания клиентов REST из файла спецификаций OpenAPI/Swagger.

Также мы создадим проект Spring Boot, в котором будем использовать сгенерированные классы.

Мы будем использовать пример Swagger Petstore API для всего.

2. Генерация REST-клиента с помощью Swagger Codegen

Swagger предоставляет утилиту jar, которая позволяет нам создавать REST-клиенты для различных языков программирования и нескольких фреймворков.

2.1. Скачать Jar-файл

Код-gen_cli.jar можно скачать отсюда.

Новейшую версию можно найти в репозитории swagger-codegen-cli.

2.2. Generate Client

Давайте сгенерируем наш клиент, выполнив команду java -jar swagger-code-gen-cli.jar generate:

java -jar swagger-codegen-cli.jar generate \
  -i http://petstore.swagger.io/v2/swagger.json \
  --api-package com.baeldung.petstore.client.api \
  --model-package com.baeldung.petstore.client.model \
  --invoker-package com.baeldung.petstore.client.invoker \
  --group-id com.baeldung \
  --artifact-id spring-swagger-codegen-api-client \
  --artifact-version 0.0.1-SNAPSHOT \
  -l java \
  --library resttemplate \
  -o spring-swagger-codegen-api-client

Предоставленные аргументы состоят из:

    URL или путь исходного файла swagger â – предоставляется с использованием аргумента -i Имена пакетов для сгенерированных классов – предоставляется с использованием –api-package, –model-package, –invoker-package Сгенерированные свойства проекта Maven –group-id, — идентификатор-артефакта, — версия-артефакта Язык программирования сгенерированного клиента — предоставляется с помощью -l Среда реализации — предоставляется с помощью —библиотеки Выходной каталог — предоставляется с помощью —o

Чтобы получить список всех параметров, связанных с Java, введите следующую команду:

java -jar swagger-codegen-cli.jar config-help -l java

Swagger Codegen поддерживает следующие библиотеки Java (пары HTTP-клиентов и библиотек обработки JSON):

    jersey1 — Jersey1 + Jackson jersey2 — Jersey2 + притворство Джексона — OpenFeign + Jackson okhttp-gson — OkHttp + Gson retrofit (устаревшее) — Retrofit1/OkHttp + Gson retrofit2 — Retrofit2/OkHttp + Gso n rest-template — Spring RestTemplate + Jackson rest-easy — Resteasy + Jackson

В этой статье мы выбрали rest-template, поскольку он является частью экосистемы Spring.

3. Генерация REST-клиента с помощью OpenAPI Generator

OpenAPI Generator — это ответвление Swagger Codegen, способное генерировать более 50 клиентов из любых документов OpenAPI Specification 2.0/3.x.

В то время как Swagger Codegen поддерживается SmartBear, OpenAPI Generator поддерживается сообществом, в которое входят более 40 ведущих участников и создателей шаблонов Swagger Codegen в качестве членов команды-основателя.

3.1. Установка

Возможно, самый простой и переносимый метод установки — использование оболочки пакета npm, которая работает, предоставляя оболочку CLI поверх параметров командной строки, поддерживаемых кодом Java. Установка проста:

npm install @openapitools/openapi-generator-cli -g

Если вам нужен файл JAR, его можно найти в Maven Central. Давайте загрузим его сейчас:

wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/4.2.3/openapi-generator-cli-4.2.3.jar \
  -O openapi-generator-cli.jar

3.2. Generate Client

Во-первых, параметры OpenAPI Generator почти идентичны параметрам Swagger Codegen. Наиболее заметным отличием является замена флага языка -l на флаг генератора -g, который использует язык для генерации клиента в качестве параметра.

Далее давайте создадим клиент, эквивалентный тому, который мы создали с помощью Swagger Codegen, используя команду jar:

java -jar openapi-generator-cli.jar generate \
  -i http://petstore.swagger.io/v2/swagger.json \
  --api-package com.baeldung.petstore.client.api \
  --model-package com.baeldung.petstore.client.model \
  --invoker-package com.baeldung.petstore.client.invoker \
  --group-id com.baeldung \
  --artifact-id spring-openapi-generator-api-client \
  --artifact-version 0.0.1-SNAPSHOT \
  -g java \
  -p java8=true \
  --library resttemplate \
  -o spring-openapi-generator-api-client

Чтобы получить список всех параметров, связанных с Java, введите команду:

java -jar openapi-generator-cli.jar config-help -g java

OpenAPI Generator supports все те же библиотеки Java, что и Swagger CodeGen, плюс несколько дополнительных. Генератор OpenAPI поддерживает следующие библиотеки Java (пары HTTP-клиентов и библиотек обработки JSON):

    jersey1 — Jersey1 + Jackson jersey2 — Jersey2 + Jackson feign — OpenFeign + Jackson okhttp-gson — OkHttp + Gson retrofit (устаревшее) — Retrofit1/OkHttp + Gson retrofit2 — Retrofit2/OkHttp + Gson resttemplate — Spring RestTemplate + веб-клиент Jackson — Spring 5 WebClient + Jackson (только OpenAPI Generator) resteasy — Resteasy + Jackson vertx — VertX + Jackson google-api-client — клиент Google API + Jackson rest-assured — rest-assured + Jackson/Gson (только для Java 8) native — Java native HttpClient + Jackson (только для Java 11; только для генератора OpenAPI) microprofile — клиент микропрофиля + Jackson (только для генератора OpenAPI)

4. Создание проекта Spring Boot

Теперь давайте создадим новый проект Spring Boot.

4.1. Зависимость Maven

«Сначала мы добавим зависимость библиотеки сгенерированного API-клиента в файл pom.xml нашего проекта:

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>spring-swagger-codegen-api-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

4.2. Предоставление API-классов как Spring Beans

Чтобы получить доступ к сгенерированным классам, нам нужно настроить их как bean-компоненты:

@Configuration
public class PetStoreIntegrationConfig {

    @Bean
    public PetApi petApi() {
        return new PetApi(apiClient());
    }
    
    @Bean
    public ApiClient apiClient() {
        return new ApiClient();
    }
}

4.3. Конфигурация клиента API

Класс ApiClient используется для настройки аутентификации, базового пути API, общих заголовков и отвечает за выполнение всех запросов API.

Например, если вы работаете с OAuth:

@Bean
public ApiClient apiClient() {
    ApiClient apiClient = new ApiClient();

    OAuth petStoreAuth = (OAuth) apiClient.getAuthentication("petstore_auth");
    petStoreAuth.setAccessToken("special-key");

    return apiClient;
}

4.4. Основное приложение Spring

Нам нужно импортировать только что созданную конфигурацию:

@SpringBootApplication
@Import(PetStoreIntegrationConfig.class)
public class PetStoreApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(PetStoreApplication.class, args);
    }
}

4.5. Использование API

Поскольку мы настроили наши классы API как bean-компоненты, мы можем свободно внедрять их в наши классы, управляемые Spring:

@Autowired
private PetApi petApi;

public List<Pet> findAvailablePets() {
    return petApi.findPetsByStatus(Arrays.asList("available"));
}

5. Альтернативные решения

Существуют и другие способы создания клиента REST, отличные от выполнение Swagger Codegen или CLI генератора OpenAPI.

5.1. Плагин Maven

Плагин swagger-codegen Maven, который можно легко настроить в файле pom.xml, позволяет генерировать клиент с теми же параметрами, что и интерфейс командной строки Swagger Codegen.

Это базовый фрагмент кода, который мы можем включить в pom.xml нашего проекта для автоматического создания клиента:

<plugin>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>2.2.3</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>swagger.yaml</inputSpec>
                <language>java</language>
                <library>resttemplate</library>
            </configuration>
        </execution>
    </executions>
</plugin>

5.2. Swagger Codegen Online Generator API

Уже опубликованный API, который помогает нам генерировать клиент, отправляя запрос POST на URL-адрес http://generator.swagger.io/api/gen/clients/java, передавая URL-адрес спецификации вместе с другие параметры в теле запроса.

Давайте сделаем пример, используя простую команду curl:

curl -X POST -H "content-type:application/json" \
  -d '{"swaggerUrl":"http://petstore.swagger.io/v2/swagger.json"}' \
  http://generator.swagger.io/api/gen/clients/java

Ответ будет в формате JSON, который содержит ссылку для загрузки, содержащую сгенерированный клиентский код в формате zip. Вы можете передать те же параметры, что и в интерфейсе командной строки Swager Codegen, для настройки выходного клиента.

https://generator.swagger.io содержит документацию Swagger для API, где мы можем проверить его документацию и попробовать.

5.3. OpenAPI Generator Online Generator API

Как и Swagger Godegen, OpenAPI Generator также имеет онлайн-генератор. Давайте выполним пример с помощью простой команды curl:

curl -X POST -H "content-type:application/json" \
  -d '{"openAPIUrl":"http://petstore.swagger.io/v2/swagger.json"}' \
  http://api.openapi-generator.tech/api/gen/clients/java

Ответ в формате JSON будет содержать загружаемую ссылку на сгенерированный клиентский код в формате zip. Вы можете передать те же параметры, что и в интерфейсе командной строки Swagger Codegen, для настройки выходного клиента.

https://github.com/OpenAPITools/openapi-generator/blob/master/docs/online.md содержит документацию по API.

6. Заключение

Swagger Codegen и OpenAPI Generator позволяют быстро создавать клиенты REST для вашего API на многих языках и с выбранной вами библиотекой. Мы можем создать клиентскую библиотеку с помощью инструмента CLI, плагина Maven или онлайн-API.

Это проект на основе Maven, который содержит три модуля Maven: сгенерированный клиент Swagger API, сгенерированный клиент OpenAPI и приложение Spring Boot.

Как всегда, вы можете найти код на GitHub.