programing

스웨거 코드젠을 사용하여 간단한 REST 클라이언트를 개발하는 방법은 무엇입니까?

testmans 2023. 6. 29. 19:54
반응형

스웨거 코드젠을 사용하여 간단한 REST 클라이언트를 개발하는 방법은 무엇입니까?

Swagger에 대해 배우고 있으며 Swagger 코드젠을 사용하여 REST Client를 생성하는 방법을 배우고 있습니다.Swagger로 문서화하는 방법을 알고 있으며 Swagger로 간단한 REST Server를 생성하는 방법도 알고 있지만 Swagger 코드젠으로 간단한 REST Client를 생성하는 방법을 모릅니다.

예를 들어, 간단한 앱이 있는데 REST Server이고 REST Client를 생성하려고 합니다.스웨거 코드젠으로 해도 될까요?

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";
    }

}

직원 휴식 클라이언트:

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 Client는 제가 개발한 것인데 제가 Swagger codegen으로 이 REST Client 개발을 할 수 있는지 그리고 어떻게 할 수 있는지 알고 싶습니다.pom.xml에 swagger-codegen-maven-plugin만 추가하면 됩니까?나는 이 플러그인과 yml 파일을 추가하는 것에 대해 들었고 Swagger는 REST Client를 만들 것입니다.어떤 피드백이든 감사하겠습니다!

예. 를 사용하여 REST 클라이언트를 생성할 수 있습니다.하지만 그 전에 YAML이나 JSON에서 REST API를 설명해야 합니다. 주로 다음과 같은 이유 때문입니다.swagger-codegen-maven-pluginREST 클라이언트는 이 사양으로 작성된 파일에서만 생성할 수 있습니다.

다른 답변에서는 REST 컨트롤러 소스 코드에서 사양을 자동으로 생성하기 위해 내 솔루션이 한 걸음 더 나아가는 동안 사양을 수동으로 작성해야 한다고 가정합니다.

최신 OpenAPI 버전은 3.0입니다.그러나 가져온 스웨거 주석의 패키지를 기준으로 버전 2.0(또는 이전 버전)을 사용하고 있습니다.따라서 제 솔루션은 당신이 OpenAPI 2.0을 사용하고 있다고 가정합니다.

개방형 API 규격 생성 중

먼저, Swagger-maven-plugin을 사용하여 RestController 소스 코드에서 OpenAPI 사양을 생성할 수 있습니다.기본적으로 Swagger 주석을 분석합니다.@RestController<locations>을 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 클라이언트를 생성하는 중

나 뒤에swagger.json생성되면 / 수 . . . . . . . . . . . . . . . . . . . . . . . . . . /src/main/main/main/swagger.json (예: /src/main/main/swagger.json)는 클라이언트 프로젝트입니다.그러면 사용할 수 있습니다.swagger-codegen-maven-plugin합니다. HTTP 클라이언트입니다.

기본적으로 테스트 사례 및 기타 문서화 작업을 포함하는 전체 메이븐 프로젝트를 생성합니다.하지만 제가 원하는 것은 다른 것 없이 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>

, RestTemplate라는 됩니다.target/generated-sources/restclient생성된 클라이언트를 사용하려면 IDE를 구성하여 Import해야 할 수 있습니다. (이클립스의 경우 Project Properties ➡️ Java Build Path ➡️ 생성된 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/XmlRootElementJava8+를 사용할 때 생성 중 예외가 발생합니다. 이를 참조해야 할 수도 있습니다.

업데이트됨:

당신의 질문은 다른 게시물에서 답변되었습니다.보기: 관련 게시물

...

참고로 명령줄을 사용한 간단한 접근 방식:

그것에 대해 Baledung에는 좋은 튜토리얼이 있습니다: 스웨거 코드젠으로 휴식 클라이언트를 만드는 방법.

예: 명령 실행:

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. 레트로핏2/옥Http+Gson
  6. 스프링레스트 템플릿 + 잭슨
  7. 휴식 + 잭슨

추신: 보시다시피 나머지 클라이언트는 스웨거 사양 정의에서 생성되며 "-i" 인수로 정의됩니다.

스웨거 엔드포인트

애플리케이션의 Swagger 끝점에 액세스할 수 있는 위치는 다음과 같습니다.

  1. Swagger 2.0 JSON API 문서 테스트

    http://localhost:8080/v2/api-hosts?group=hosts

    http://localhost:8080/v2/api-hosts(이름이 지정된 그룹을 설정하지 않은 경우)employee)

  2. 스웨거 UI 테스트 중

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

스웨거 코드젠 실행 파일 다운로드

메이븐 중앙 저장소에서 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

스웨거 그룹이 없으면,

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응용 프로그램의 URLSwagger api docs.
  • -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

생성된 클라이언트 프로젝트의 예는 여기에서 확인할 수 있습니다.

REST 클라이언트 사용

클라이언트 프로젝트에 많은 Java 클래스가 포함되어 있습니다.그러나 가장 중요한 클래스는 EmployeeControllerApi.java입니다.REST 클라이언트 클래스를 만들기 위한 모든 논리를 포함하는 클래스입니다.

다른 중요 클래스는 EmployeeControllerApiTest.java입니다.EmployeeControllerApi.java를 사용하는 방법을 보여줍니다.또한 생성된 클라이언트 프로젝트는 README 파일을 제공하므로 매우 유용합니다.

URL 변경 사항

ApiClient 클래스에는 HTTP 클라이언트 연결 설정과 관련된 정보가 포함되어 있습니다.다음을 확인하십시오.basePathREST 응용 프로그램이 정확합니다.생성된 예제에서,basePath가 있었습니다.https://localhost:8080대신 URLhttp://localhost:8080.

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 호출 예제

다음은 다음과 같은 예제입니다.employeeREST POST 메서드 호출을 수행합니다.

Employee employee = new Employee();
employee.setId(3L);
employee.setFirstName("Sam");
employee.setLastName("Fox");
employee.setEmail("sfox@gmail.com");

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

다음과 유사한 응답을 해야 합니다.

class Employee {
    email: sfox@gmail.com
    firstName: Sam
    id: 3
    lastName: Fox
}

여기에서 완전한 를 찾을 수 있습니다.

https://editor.swagger.io 으로 이동하여 스웨거 설명서를 만듭니다. 저는 "스웨거 펫스토어"를 예로 사용하고 있습니다.

이제 File, Import File을 선택하고 다운로드한 swagger.json 파일을 업로드합니다.

https://swagger.io/tools/swagger-codegen/ 열기

다음 단계를 수행합니다.

저장소를 디스크 git clone https://github.com/swagger-api/swagger-codegen.git 에 복제합니다.

ii) mvn 클린 패키지 실행

iii) swagger-codegen-cli.jar 파일을 대상 폴더에서 컴퓨터의 로컬 드라이브로 복사합니다.

iv) 다음 명령을 실행하여 클라이언트를 생성합니다.

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

이 명령에는 세 가지 인수가 있습니다.

 -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 저장소에서 다운로드할 수 있거나 통합 Swagger에서 새로운 또는 기존 OpenAPI 정의 API에 대해 생성할 수 있습니다.허브 플랫폼.스웨거Hub은 Swagger Editor, UI 및 Codegen 툴을 Swagger(OpenAPI) 사양으로 작업하는 API 팀을 위해 구축된 통합 API 설계 및 설명서로 클라우드에 제공합니다.

메이븐과 그래들과 같은 빌드 도구용 플러그인이 있습니다. 여기에 추가하지 않고 몇 가지 답변만 이미 제공되었기 때문입니다.

스웨거 플러그인을 추가하기만 하면 휴식 클라이언트가 생성되지 않습니다. 아래 단계를 따라야 합니다.

사양을 YAML 형식으로 기록합니다.사양 결과를 기반으로 생성됩니다.사양을 YAML 파일로 저장합니다.그것은 swagger.swagger로 저장될 것입니다. tutorial: https://howtodoinjava.com/swagger2/code-generation-for-rest-api/ .

저는 이것으로 많은 어려움을 겪었고 결국 저만의 도구를 만들었습니다.그것은 정말 작고 오직 의존합니다.spring-web저는 그것이 봄의 일부가 될 수 있는지 알아보기 위해 PR까지 신청했습니다.

는 Spring Rest Template Client라고 부르며 Feign과 다른 도구들이 하는 처럼 하지만 훨씬 더 가볍고 Spring만 지원합니다.

final MyApiInterface myClient = SpringRestTemplateClientBuilder
  .create(MyApiInterface.class)
  .setUrl(this.getMockUrl())
  .setRestTemplate(restTemplate)         // Optional
  .setHeader("header-name", "the value") // Optional
  .setHeaders(HttpHeaders)               // Optional
  .build();

언제든지 방문 가능myClient 사을용하 HTTP 호출변의 됩니다.MyApiInterface:

final ResponseEntity<MyDTO> response = myClient.getMyDto();

언급URL : https://stackoverflow.com/questions/57545884/how-to-develop-a-simple-rest-client-using-swagger-codegen

반응형