使用Spring Boot + Tests +文档创建REST API [PART 05]
#网络开发人员 #java #swagger #documentation

你好!

我回到本教程中,教您如何使用Spring Boot开发REST API。正如我之前说的,本教程分为5个部分,如下表所示:

部分 内容
第01部分 Application Startup
第02部分 Settings and Database
第03部分 API Implementation
第04部分 Tests + Coverage
第05部分 Swagger文档

可以预期,从最后一部分,您将学习以下内容:

  • 将Swagger用于项目文档。

记住,在本教程中使用以下工具:

  • JDK 17
  • Smart
  • 失眠
  • Maven
  • mySQL数据库

我们到达了教程的最后一部分。在previous part中,您学会了如何进行单元和集成测试。除了检查执行的测试的覆盖范围外。

在最后一部分中,这将有点短,您将学习如何记录API。

当我们与API合作时,我们必须牢记其他开发人员需要访问它。不一定是您的源代码,而是对请求的响应。

因此,我们需要创建文档,以视觉上显示系统的所有可能访问路线及其响应。


步骤01-添加了SpringDoc库

我们将使用Swagger,该Swagger已经以记录API

而闻名

要在我们的应用程序中使用它,我们将不得不在pom.xml文件中添加Spring Doc依赖关系:


<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
   <version>2.0.2</version>
</dependency>

通过执行此操作(并重新启动您的服务器),我们可以访问URL http://localhost:8080/swagger-ui/index.html,并且将看到以下屏幕:

Swagger initial screen

您可以看到,Swagger已经映射了我们在系统中创建的所有路线,但是它没有完成所有必要的信息以进行良好的文档。例如,单击以查看有关以下途径的更多信息:

Route description

它仅表示响应将是字符串,而不是显示实际内容。因此,我们将必须对控制器进行以下修改:


package com.simplelibrary.simplelibraryAPI.controller;

import com.simplelibrary.simplelibraryAPI.dto.BookRequestDTO;
import com.simplelibrary.simplelibraryAPI.dto.BookResponseDTO;
import com.simplelibrary.simplelibraryAPI.model.Book;
import com.simplelibrary.simplelibraryAPI.service.BookService;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.IOException;

@RestController
@RequestMapping("books")
public class BookController {

@Autowired
private BookService bookService;


@ApiResponse(
            content = { @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = BookResponseDTO.class)))})
@GetMapping
public ResponseEntity<Page<BookResponseDTO>> getAllBooks(@PageableDefault(size=10, sort={"title"}) Pageable pagination) throws IOException {
    var page = bookService.getAllBooks(pagination);
    return ResponseEntity.ok(page);
}

    @ApiResponse(
            content = { @Content(mediaType = "application/json", schema = @Schema(implementation = BookResponseDTO.class))})

@GetMapping("/{id}")
public ResponseEntity show(@PathVariable Long id){
    var book = bookService.show(id);
    return ResponseEntity.ok(book);
}


@ApiResponse(
            content = { @Content(mediaType = "application/json", schema = @Schema(implementation = Book.class))})
@PostMapping
    public ResponseEntity store(@RequestBody @Valid BookRequestDTO bookRequest, UriComponentsBuilder uriBuilder) throws IOException {
        var book = bookService.store(bookRequest);
        var uri = uriBuilder.path("/books/{id}").buildAndExpand(book.getId()).toUri();
        return ResponseEntity.created(uri).body(book);
    }

@ApiResponse(
            content = { @Content(mediaType = "application/json", schema = @Schema(implementation = Book.class))})
@PutMapping("/{id}")
    public ResponseEntity update(@PathVariable Long id, @RequestBody @Valid BookRequestDTO bookRequest){
    var book = bookService.update(id, bookRequest);
    return ResponseEntity.ok(book);

}

@DeleteMapping("/{id}")
    public ResponseEntity delete(@PathVariable Long id){
    bookService.delete(id);
    return ResponseEntity.noContent().build();
}




}


请注意,已经添加了@ApiResponse注释。在其中,我们将每个路线的响应内容放在其中。因此,检查相同的路线时:

Updated route description

您可以通过单击尝试按钮来从此屏幕创建请求:

Request

Response


我们在本教程中学到的知识

好吧,我希望您喜欢春季靴子教程的这部续集。我相信,借助这5个部分获得的知识,您可以开始朝着创建更强大的应用程序迈进。

不要仅仅坚持本教程中教授的内容,请自由修改此处添加的任何代码。您可以与我联系的任何问题!

再次记住,您可以找到HERE

的完整项目