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クライアントを作成します。どんなフィードバックでも歓迎します!
はい。 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);
注意 :
javax/xml/bind/annotation/XmlRootElement
例外が発生した場合は、 this を参照する必要がある場合があります。更新しました:
あなたの質問は別の投稿で答えられました。見てください: 関連する投稿
...
それについて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は、以下のクライアント実装をサポートしています。
追伸ご覧のとおり、残りのクライアントはswagger spec定義から生成され、「-i」引数で定義されています。
アプリケーションのSwaggerエンドポイントにアクセスできるとします。
Swagger 2.0 JSON APIドキュメントのテスト
http:// localhost:8080/v2/api-docs?group = employee
http:// localhost:8080/v2/api-docs (employee
という名前のグループを設定していない場合)
Swagger UIのテスト
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
...
コード生成が完了すると、次の構造を持つ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 にあります。
クライアントプロジェクトには、多くのJavaクラスが含まれています。ただし、最も重要なクラスは EmployeeControllerApi.Java です。これは、RESTクライアントクラスを作成するためのすべてのロジックを含むクラスです。
他の重要なクラスは EmployeeControllerApiTest.Java です。 EmployeeControllerApi.Java の使用方法を示します。生成されたクライアントプロジェクトは、非常に役立つ [〜#〜] readme [〜#〜] ファイルも提供します。
ApiClient クラスには、HTTPクライアント接続の確立に関連する情報が含まれています。 RESTアプリケーションへのbasePath
が正しいことを確認してください。生成された例では、basePath
にはhttps://localhost:8080
ではなくhttp://localhost:8080
URLがありました。
生成されたプロジェクトは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 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 を見つけることができます。
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などのビルドツール用のプラグインがあります。すでにいくつかの回答が記載されているため、ここには追加しません
swaggerプラグインを追加するだけでは、残りのクライアントは生成されません。以下の手順に従う必要があります。
仕様をYAML形式で書き留めます。仕様結果に基づいて、生成されます。仕様をYAMLファイルとして保存します。チュートリアルに従ってswagger.yamlとして保存されます: https://howtodoinjava.com/swagger2/code-generation-for-rest-api/