Cài đặt Swagger với SpringFox
Để tích hợp Swagger vào dự án Maven, bạn cần thêm các dependency sau:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.5.0</version>
</dependency>
Định nghĩa API với @API
Annotation @API dùng để khai báo một API trong Swagger. Bạn có thể sử dụng thuộc tính description để mô tả chức năng của API.
@API(value = "Quản lý người dùng", description = "Các dịch vụ liên quan đến quản lý tài khoản người dùng")
Bên cạnh thuộc tính description và value, @API còn có các thuộc tính tùy chọn:
| Loại | Mô tả |
|---|---|
| Authorization[] | Quyền truy cập API |
| String | Đường dẫn cơ sở cho RESTful API |
| String | Loại media được chấp nhận |
| int | Vị trí trong danh sách tài nguyên |
| String | Loại nội dung trả về |
| String | Protocol của API |
| boolean | Ẩn API trong Swagger |
Định nghĩa phương thức với @ApiOperation
Mỗi API có thể chứa nhiều phương thức được định nghĩa bởi @ApiOperation. Annotation này cho phép bạn:
- Sử dụng value và notes để mô tả chức năng của phương thức
- Sử dụng @ApiParam để mô tả tham số đầu vào
- Chỉ định loại trả về với response
- Cần chú ý phải chỉ định method trong @RequestMapping
@ApiOperation(value = "Đăng nhập người dùng",
notes = "Phương thức này cho phép người dùng đăng nhập vào hệ thống",
response = User.class,
httpMethod = "POST")
Các thuộc tính tùy chọn của @ApiOperation:
| Loại | Mô tả |
|---|---|
| Authorization[] | Quyền truy cập người dùng |
| String | Loại media được chấp nhận |
| String | Phương thức HTTP (GET, PUT, POST, DELETE) |
| String | Bí danh của phương thức |
| String | Mô tả chi tiết phương thức |
| int | Vị trí |
| String | Loại nội dung trả về |
| String | Protocol của phương thức |
| Class | Loại đối tượng trả về |
| String | Container của response |
| String | Tags |
| boolean | Ẩn phương thức trong Swagger |
Mô tả tham số với @ApiParam
Đối với các tham số đơn giản:
@ApiParam(value = "ID người dùng", required = true) String userId
Đối với các tham số phức tạp, cần định nghĩa @ApiModel và @ApiModelProperty trong lớp:
@ApiModel(description = "Đối tượng yêu cầu chung")
public class GeneralRequestVO {
@ApiModelProperty(value = "Thông điệp yêu cầu", required = true)
private String message;
// các thuộc tính khác
}
Các thuộc tính tùy chọn của @ApiParam:
| Loại | Mô tả |
|---|---|
| String | Access |
| String | Giá trị hợp lệ |
| boolean | Cho phép nhiều giá trị |
| String | Giá trị mặc định |
| String | Tên tham số |
| boolean | Bắt buộc |
| String | Mô tả tham số |
Định nghĩa giá trị trả về
Đối với các lớp trả về, cần định nghĩa @ApiModel và @ApiModelProperty tương tự như @ApiParam. Ngoài ra, có thể sử dụng @ApiResponses để định nghĩa các mã lỗi:
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Thành công"),
@ApiResponse(code = 400, message = "Yêu cầu không hợp lệ"),
@ApiResponse(code = 404, message = "Không tìm thấy tài nguyên")
})
Tổng quan các annotation Swagger
| Tên | Mô tả |
|---|---|
| @Api | Đánh dấu một lớp là tài nguyên Swagger |
| @ApiImplicitParam | Mô tả một tham số trong operation |
| @ApiImplicitParams | Bao gồm nhiều @ApiImplicitParam |
| @ApiModel | Cung cấp thông tin thêm về các model Swagger |
| @ApiModelProperty | Thêm và thao tác dữ liệu của thuộc tính model |
| @ApiOperation | Mô tả một operation hoặc HTTP method |
| @ApiParam | Thêm metadata cho tham số operation |
| @ApiResponse | Mô tả một phản hồi có thể có |
| @ApiResponses | Bao gồm nhiều @ApiResponse |
| @Authorization | Khai báo scheme ủy quyền |
| @AuthorizationScope | Mô tả scope OAuth2 |
Chi tiết các annotation
@Api
Được sử dụng để khai báo tài nguyên API Swagger. Nó ảnh hưởng đến cả Resource Listing và API Declaration.
@Path("/san-pham")
@Api(value = "/san-pham", description = "Các thao tác liên quan đến sản phẩm")
@Produces({"application/json", "application/xml"})
public class ProductResource { ... }
@ApiOperation
Được sử dụng để khai báo một operation trong tài nguyên API.
@GET
@Path("/tim-kiem")
@ApiOperation(value = "Tìm kiếm sản phẩm",
notes = "Tìm kiếm sản phẩm theo nhiều tiêu chí",
response = Product.class,
responseContainer = "List")
public Response searchProducts(...) { ... }
@ApiResponses và @ApiResponse
Dùng để mô tả các mã trạng thái HTTP trả về.
@ApiResponses(value = {
@ApiResponse(code = 400, message = "ID không hợp lệ"),
@ApiResponse(code = 404, message = "Sản phẩm không tồn tại")
})
@ApiParam
Dùng để thêm metadata cho các tham số của phương thức.
@Path("/{id}")
@ApiOperation(value = "Cập nhật sản phẩm")
public Response updateProduct(
@ApiParam(value = "ID sản phẩm cần cập nhật", required = true) @PathParam("id") String id,
@ApiParam(value = "Đối tượng sản phẩm cập nhật", required = true) Product product) { ... }
@ApiModel và @ApiModelProperty
Dùng để mô tả các model trong API.
@ApiModel(value="ProductModel", description="Mô hình sản phẩm")
public class Product {
@ApiModelProperty(value = "Trạng thái sản phẩm", allowableValues = "còn_hàng,hết_hàng")
private String status;
// các thuộc tính khác
}