How to develop a simple REST Client using Swagger codegen?
Updated:
Your question was answered in another post. Take a look at: related post
...
FYI a simple approach using command line:
There is a good tutorial at baeldung about it: how to create rest client with swagger codegen
E.g. Execute command:
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 supports the following Client implementations:
- jersey1 + Jackson
- Jersey2 + Jackson
- Feign + Jackson
- OkHttp + Gson
- Retrofit2/OkHttp + Gson
- Spring RestTemplate + Jackson
- Resteasy + Jackson
P.S. As you can see, the rest client is generated from swagger spec definition and it is definided with “-i” argument.
Yes. You can use swagger-codegen-maven-plugin
to generate a REST client. But before that , you need to describe the REST API in YAML or JSON in OpenAPI Specification
mainly because swagger-codegen-maven-plugin
only can generate a REST client from a file written in this specification.
Other answers assume that you need to write the specification manually while my solution take a step further to automatically generating the specification from the REST controller source codes.
The latest OpenAPI version is 3.0 .But based on the package of your imported swagger annotation , you are using version 2.0 (or before). So my solution assume you are using OpenAPI 2.0.
Generating Open API Specification
First, you can use swagger-maven-plugin to generate an OpenAPI spec from the RestController source codes. It basically analyses the Swagger annotations annotated in the @RestController
classes that specified in <locations>
and dump the OpenAPI spec to /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>
Execute the followings maven command to start generation:
mvn clean compile
Generating Rest Client
After swagger.json
is generated, you can copy and paste it to your client project (e.g. /src/main/resources/swagger.json) . We can then use swagger-codegen-maven-plugin
to generate a HTTP client .
By default , it will generate the whole maven project which includes test cases and other documentation stuff. But what I want is just the HttpClient 's source codes without other things. After several trial and error , I settle down to the following configuration :
<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>
The generated HTTP client is based on RestTemplate and will be generated to the folder target/generated-sources/restclient
. You may have to configure your IDE to import the generated client in order to use it . (In case of Eclipse, you can configure in Project Properties ➡️ Java Build Path ➡️ Add the folder of the generated rest client)
To start generating the client , just execute the maven command :
mvn clean compile
To use the generated HTTP client :
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);
Note :
- If you come across
javax/xml/bind/annotation/XmlRootElement
exception during generation when using java8+ , you may need to refer to this.