web-dev-qa-db-ja.com

単純なRESTクライアントをSwagger codegenを使用して開発する方法は?

Swaggerと、Swagger codegenを使用してRESTクライアントを生成する方法について学習しています。 Swaggerでドキュメントを作成する方法を知っています。また、Swaggerで単純なRESTサーバーを生成する方法も知っていますが、Swagger codegenで単純なRESTクライアントを生成する方法がわかりません。

たとえば、シンプルなアプリがあります。それはRESTサーバーであり、RESTクライアントを生成したいと思います。 Swagger codegenでそれを行うことはできますか?

RESTサーバーのコントローラー:

package com.dgs.spring.springbootswagger.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

@RestController
@RequestMapping("/api/v1")
@Api(value = "Employee Management System", description = "Operations pertaining to employee in Employee Management System")
public class EmployeeController {

     @Autowired
     private EmployeeRepository employeeRepository;

        @ApiOperation(value = "View a list of available employees", response = List.class)
        @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Successfully retrieved list"),
            @ApiResponse(code = 401, message = "You are not authorized to view the resource"),
            @ApiResponse(code = 403, message = "Accessing the resource you were trying to reach is forbidden"),
            @ApiResponse(code = 404, message = "The resource you were trying to reach is not found")
        })
     @GetMapping("/employees")
     public List<Employee> getAllEmployees() {
         return employeeRepository.findAll();
     }

     @ApiOperation(value = "Get an employee by Id")   
     @GetMapping("/employees/{id}")
     public ResponseEntity<Employee> getEmployeeById(
             @ApiParam(value = "Employee id from which employee object will retrieve", required = true) @PathVariable(value = "id") Long employeeId)
             throws ResourceNotFoundException {

          Employee employee = employeeRepository.findById(employeeId)
            .orElseThrow(() -> new ResourceNotFoundException("Employee not found for this id :: " + employeeId));

          return ResponseEntity.ok().body(employee);
     }

     @ApiOperation(value = "Add an employee")
     @PostMapping("/employees")
     public Employee createEmployee(
             @ApiParam(value = "Employee object store in database table", required = true) @Valid @RequestBody Employee employee) {
         return employeeRepository.save(employee);
     }

     @ApiOperation(value = "Update an employee")
     @PutMapping("/employees/{id}")
     public ResponseEntity<Employee> updateEmployee(
             @ApiParam(value = "Employee Id to update employee object", required = true) @PathVariable(value = "id") Long employeeId,
             @ApiParam(value = "Update employee object", required = true) @Valid @RequestBody Employee employeeDetails) throws ResourceNotFoundException {

          Employee employee = employeeRepository.findById(employeeId)
            .orElseThrow(() -> new ResourceNotFoundException("Employee not found for this id :: " + employeeId));

          employee.setEmail(employeeDetails.getEmail());
          employee.setLastName(employeeDetails.getLastName());
          employee.setFirstName(employeeDetails.getFirstName());
          final Employee updatedEmployee = employeeRepository.save(employee);

          return ResponseEntity.ok(updatedEmployee);
     }

     @ApiOperation(value = "Delete an employee")
     @DeleteMapping("/employees/{id}")
     public Map<String, Boolean> deleteEmployee(
             @ApiParam(value = "Employee Id from which employee object will delete from database table", required = true) @PathVariable(value = "id") Long employeeId)
       throws ResourceNotFoundException {

      Employee employee = employeeRepository.findById(employeeId)
        .orElseThrow(() -> new ResourceNotFoundException("Employee not found for this id :: " + employeeId));

      employeeRepository.delete(employee);
      Map<String, Boolean> response = new HashMap<>();
      response.put("deleted", Boolean.TRUE);

      return response;
     }
}

その後、シンプルなRESTクライアントを開発しました。

package com.dgs.restclient.controllers;

@Controller
public class UpdateController {

    @Autowired
    private EmployeeRestClient restClient;

    @GetMapping("/showStartUpdate")
    public String showStartCheckin() {
        return "startUpdate";
    }

    @PostMapping("/startUpdate")
    public String startCheckIn(@RequestParam("employeeId") Long employeeId, ModelMap modelMap) {

        Employee employee = restClient.findEmployee(employeeId);
        modelMap.addAttribute("employee", employee);

        return "displayEmployeeDetails";
    }

    @PostMapping("/completeUpdate")
    public String completeCheckIn(@RequestParam("employeeId") Long employeeId,
            @RequestParam("employeeFirstName") String employeeFirstName,
            @RequestParam("employeeLastName") String employeeLastName,
            @RequestParam("employeeEmail") String employeeEmail) {

        EmployeeUpdateRequest employeeUpdateRequest = new EmployeeUpdateRequest();
        employeeUpdateRequest.setId(employeeId);
        employeeUpdateRequest.setFirstName(employeeFirstName);
        employeeUpdateRequest.setLastName(employeeLastName);
        employeeUpdateRequest.setEmail(employeeEmail);
        restClient.updateEmployee(employeeUpdateRequest);

        return "updateConfirmation";
    }

}

EmployeeRestClient:

package com.dgs.restclient.integration;

@Component
public class EmployeeRestClientImpl implements EmployeeRestClient {

    private static final String EMPLOYEE_REST_URL = 
            "http://localhost:8080/api/v1/employees/";

    @Override
    public Employee findEmployee(Long id) {

        RestTemplate restTemplate = new RestTemplate();
        Employee employee = restTemplate
                .getForObject(EMPLOYEE_REST_URL + id, Employee.class);

        return employee;
    }

    @Override
    public Employee updateEmployee(EmployeeUpdateRequest request) {

        RestTemplate restTemplate = new RestTemplate();
        restTemplate
                .put(EMPLOYEE_REST_URL + request.getId(), request, Employee.class); 

        Employee employee = restTemplate
                .getForObject(EMPLOYEE_REST_URL + request.getId(), Employee.class);

        return employee;
    }

}

このRESTクライアントは私が開発したものであり、Swagger codegenを使用してこのRESTクライアントを開発できるかどうか、またその方法を知りたいですか? pom.xmlにswagger-codegen-maven-pluginを追加するだけでよいですか?このプラグインとymlファイルの追加について聞いたところ、SwaggerがRESTクライアントを作成します。どんなフィードバックでも歓迎します!

8
elvis

はい。 swagger-codegen-maven-plugin を使用してRESTクライアントを生成できます。ただし、その前にREST APIを記述する必要がありますYAMLまたはJSONの OpenAPI Specification の主な理由は、swagger-codegen-maven-pluginがこの仕様で記述されたファイルからRESTクライアントのみを生成できるためです。

他の回答では、仕様を手動で記述する必要があると想定していますが、私のソリューションでは、RESTコントローラーのソースコードから仕様を自動的に生成するために、さらに一歩進んでいます。

OpenAPIの最新バージョンは3.0ですが、インポートしたswaggerアノテーションのパッケージに基づいて、バージョン2.0(またはそれ以前)を使用しています。したがって、私のソリューションは、OpenAPI 2.0を使用していることを前提としています。

Generating Open API仕様

最初に、 swagger-maven-plugin を使用して、RestControllerソースコードからOpenAPI仕様を生成できます。基本的には、@RestControllerで指定された<locations>クラスで注釈が付けられたSwagger注釈を分析し、OpenAPI仕様を/src/main/resources/swagger.jsonにダンプします。

<plugin>
    <groupId>com.github.kongchen</groupId>
    <artifactId>swagger-maven-plugin</artifactId>
    <version>3.1.5</version>
    <configuration>
        <apiSources>
            <apiSource>
                <springmvc>true</springmvc>
                <locations>
                    <location>com.dgs.spring.springbootswagger.controller.EmployeeController</location>
                    <location>com.dgs.spring.springbootswagger.controller.FooController</location>
                </locations>
                <schemes>
                    <scheme>http</scheme>
                </schemes>
                <Host>127.0.0.1:8080</Host>
                <basePath>/</basePath>
                <info>
                    <title>My API</title>
                    <version>1.1.1</version>
                </info>
                <swaggerDirectory>${basedir}/src/main/resources/</swaggerDirectory>
            </apiSource>
        </apiSources>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

次のmavenコマンドを実行して生成を開始します。

mvn clean compile

Rest Clientを生成しています

swagger.jsonが生成されたら、それをコピーしてクライアントプロジェクトに貼り付けることができます(例:/src/main/resources/swagger.json)。次に、swagger-codegen-maven-pluginを使用してHTTPクライアントを生成できます。

デフォルトでは、 mavenプロジェクト全体 が生成され、テストケースやその他のドキュメントが含まれます。しかし、私が欲しいのは、他に何もないHttpClientのソースコードだけです。いくつかの試行錯誤の後、私は次の構成に落ち着きました:

<plugin>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>2.4.7</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${basedir}/src/main/resources/swagger.json</inputSpec>
                <language>Java</language>
                <library>resttemplate</library>
                <output>${project.basedir}/target/generated-sources/</output>

                <apiPackage>com.example.demo.restclient.api</apiPackage>
                <modelPackage>com.example.demo.restclient.model</modelPackage>
                <invokerPackage>com.example.demo.restclient</invokerPackage>

                <generateApiTests>false</generateApiTests>
                <generateModelTests>false</generateModelTests>
                <generateApiDocumentation>false</generateApiDocumentation>
                <generateModelDocumentation>false</generateModelDocumentation>
                <configOptions>
                    <dateLibrary>Java8</dateLibrary>
                    <sourceFolder>restclient</sourceFolder>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

生成されたHTTPクライアントはRestTemplateに基づいており、target/generated-sources/restclientフォルダーに生成されます。 IDE生成されたクライアントをインポートするには、それを使用するために構成する必要があるかもしれません。(Eclipseの場合、プロジェクトのプロパティで構成できます➡️Javaビルドパス➡️生成されたRESTクライアントのフォルダーを追加)

クライアントの生成を開始するには、mavenコマンドを実行します。

mvn clean compile

生成されたHTTPクライアントを使用するには:

ApiClient apiClient = new ApiClient();

//Override the default API base path configured in Maven
apiClient.setBasePath("http://api.example.com/api");

EmployeeManagementSystemApi api = new EmployeeManagementSystemApi(apiClient);
api.getEmployeeById(1l);

注意 :

  • Java8 +を使用しているときに生成中にjavax/xml/bind/annotation/XmlRootElement例外が発生した場合は、 this を参照する必要がある場合があります。
6
Ken Chan

更新しました:

あなたの質問は別の投稿で答えられました。見てください: 関連する投稿

...

コマンドラインを使用した簡単なアプローチ:

それについてbaeldungに良いチュートリアルがあります: swagger codegenでRESTクライアントを作成する方法

例えば。コマンドを実行:

Java -jar swagger-codegen-cli.jar generate \
  -i http://mydomain/v2/swagger.json \
  --api-package com.mypackage.api \
  --model-package com.mypackage.model \
  --invoker-package com.mypackage.invoker \
  --group-id com.mygroup \
  --artifact-id spring-swagger-codegen-api-client \
  --artifact-version 0.0.1-SNAPSHOT \
  -l Java \
  --library resttemplate \
  -o spring-swagger-codegen-api-client

Swagger Codegenは、以下のクライアント実装をサポートしています。

  1. jersey1 +ジャクソン
  2. ジャージー2 +ジャクソン
  3. フェイン+ジャクソン
  4. OkHttp + Gson
  5. Retrofit2/OkHttp + Gson
  6. Spring RestTemplate + Jackson
  7. Resteasy +ジャクソン

追伸ご覧のとおり、残りのクライアントはswagger spec定義から生成され、「-i」引数で定義されています。

6
Ariel Carrera

Swaggerエンドポイント

アプリケーションのSwaggerエンドポイントにアクセスできるとします。

  1. Swagger 2.0 JSON APIドキュメントのテスト

    http:// localhost:8080/v2/api-docs?group = employee

    http:// localhost:8080/v2/api-docsemployeeという名前のグループを設定していない場合)

  2. Swagger UIのテスト

    http:// localhost:8080/swagger-ui.html

Swagger Codegen Executableをダウンロード

Mavenセントラルリポジトリから swagger-codegen-cli-2.4.7.jar をダウンロードできます。

クライアントコードの生成

Swagger Codegen JARを取得したので、次のコマンドを実行してRESTクライアントを生成できます。

Java -jar swagger-codegen-cli-2.4.7.jar generate \
  -i http://localhost:8080/v2/api-docs?group=employee \
  -l Java \
  -o swagger-codegen-client

swaggerグループ化がない場合、

Java -jar swagger-codegen-cli-2.4.7.jar generate \
  -i http://localhost:8080/v2/api-docs \
  -l Java \
  -o swagger-codegen-client

オプション

Swagger Codegen CLIにはいくつかのオプションがありますが、クライアントコードの生成に絶対に必要なオプションを使用しています。

  • -iアプリケーションのSwagger api docsを指すURL。
  • -lクライアントのプログラミング言語、この場合はJava
  • -o生成されたクライアントコードの出力フォルダー。

上記のコマンドを実行してコードを生成すると、端末に次のメッセージが表示されます。

[main] INFO io.swagger.parser.Swagger20Parser - reading from http://localhost:8080/v2/api-docs?group=employee
[main] WARN io.swagger.codegen.ignore.CodegenIgnoreProcessor - Output directory does not exist, or is inaccessible. No file (.swagger-codegen-ignore) will be evaluated.
[main] INFO io.swagger.codegen.AbstractGenerator - writing file swagger-codegen-client/src/main/Java/io/swagger/client/model/Employee.Java
[main] INFO io.swagger.codegen.AbstractGenerator - writing file swagger-codegen-client/docs/Employee.md
[main] INFO io.swagger.codegen.AbstractGenerator - writing file swagger-codegen-client/src/main/Java/io/swagger/client/api/EmployeeControllerApi.Java
...
[main] INFO io.swagger.codegen.AbstractGenerator - writing file swagger-codegen-client/src/main/Java/io/swagger/client/ApiClient.Java
...

RESTクライアントプロジェクト

コード生成が完了すると、次の構造を持つgradle/mavenプロジェクトに気付くはずです。

__ swagger-codegen-client
  |__ README.md
  |__ build.gradle
  |__ build.sbt
  |__ docs
  |__ git_Push.sh
  |__ gradle
  |__ gradle.properties
  |__ gradlew
  |__ gradlew.bat
  |__ pom.xml
  |__ settings.gradle
  |__ src
     |__ main
        |__ Java
          |__ io.swagger.client.api
             |__ EmployeeControllerApi.Java
     |__ test
        |__ Java
          |__ io.swagger.client.api
             |__ EmployeeControllerApiTest.Java

生成されたクライアントプロジェクトの例は here にあります。

RESTクライアントの使用

クライアントプロジェクトには、多くのJavaクラスが含まれています。ただし、最も重要なクラスは EmployeeControllerApi.Java です。これは、RESTクライアントクラスを作成するためのすべてのロジックを含むクラスです。

他の重要なクラスは EmployeeControllerApiTest.Java です。 EmployeeControllerApi.Java の使用方法を示します。生成されたクライアントプロジェクトは、非常に役立つ [〜#〜] readme [〜#〜] ファイルも提供します。

URLの変更

ApiClient クラスには、HTTPクライアント接続の確立に関連する情報が含まれています。 RESTアプリケーションへのbasePathが正しいことを確認してください。生成された例では、basePathにはhttps://localhost:8080ではなくhttp://localhost:8080 URLがありました。

Java 12の変更

生成されたプロジェクトはJava 8で適切に機能します。Java 12を使用している場合は、プロジェクトをコンパイルするために次の依存関係を追加する必要があります。

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>

    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
    </dependency>

例REST呼び出し

以下は、REST POSTメソッドメソッドを呼び出してemployeeを作成する例です。

Employee employee = new Employee();
employee.setId(3L);
employee.setFirstName("Sam");
employee.setLastName("Fox");
employee.setEmail("[email protected]");

EmployeeControllerApi api = new EmployeeControllerApi();
Employee response = api.createEmployeeUsingPOST(employee);
System.out.println(response);

次のような応答が必要です。

class Employee {
    email: [email protected]
    firstName: Sam
    id: 3
    lastName: Fox
}

完全な例 here を見つけることができます。

2
Indra Basak

1) https://editor.swagger.io に移動し、swaggerドキュメントを作成します。例として「Swagger Petstore」を使用しています。

2)次に、[ファイル]、[ファイルのインポート]の順に選択し、ダウンロードしたswagger.jsonファイルをアップロードします

3)開く https://swagger.io/tools/swagger-codegen/

4)次の手順に従います。

i)リポジトリをディスクにクローンしますgit clone https://github.com/swagger-api/swagger-codegen.git

ii)mvn clean packageを実行します

iii)ターゲットフォルダーからコンピューターのローカルドライブにswagger-codegen-cli.jarファイルをコピーします。

iv)次に、次のコマンドを実行してクライアントを生成します。

     Java -jar swagger-codegen-cli.jar -i <json_file> -l python -o my_client

このコマンドには3つの引数があります。

 -i Specifies the path to the input file. This can be a URL

 -l Specifies the programming language for the client

 -o Specifies the output directory where the generate code should be located

Swagger Codegenは、OpenAPI仕様からAPIクライアントライブラリ(SDK生成)、サーバースタブ、およびドキュメントを自動的に生成できるオープンソースプロジェクトです。 Swagger Codegenは、GitHubリポジトリからダウンロードできます。または、統合されたSwaggerHubプラットフォームで、新規または既存のOpenAPI定義のAPI用に生成できます。 SwaggerHubは、Swagger(OpenAPI)仕様を使用するAPIチーム向けに構築された統合API設計およびドキュメントで、Swagger Editor、UI、およびCodegenツールをクラウドに提供します。

MavenやGradleなどのビルドツール用のプラグインがあります。すでにいくつかの回答が記載されているため、ここには追加しません

1
vaquar khan

swaggerプラグインを追加するだけでは、残りのクライアントは生成されません。以下の手順に従う必要があります。

仕様をYAML形式で書き留めます。仕様結果に基づいて、生成されます。仕様をYAMLファイルとして保存します。チュートリアルに従ってswagger.yamlとして保存されます: https://howtodoinjava.com/swagger2/code-generation-for-rest-api/

0
MangduYogii