Introdução:
Acredito que tanto o desenvolvimento front-end quanto o back-end sejam mais ou menos torturados por documentos de interface. O front-end frequentemente reclama que a documentação da interface fornecida pelo back-end é inconsistente com a situação real. O back-end também sente que escrever e manter documentos de interface consumirá muita energia e geralmente é tarde demais para atualizar. De fato, se o front-end chama o back-end ou o back-end chama o back-end, espera-se um bom documento de interface. Mas para os programadores, esse documento de interface é como comentários, muitas vezes reclamam que o código escrito por outros não tem comentários, porém, quando eles escrevem seu próprio código, o mais chato é escrever comentários. Portanto, não basta regular todos pela coerção, com o passar do tempo e a iteração das versões, a documentação da interface muitas vezes não consegue acompanhar o código.
Quando você encontra um ponto de dor, você precisa encontrar uma solução. Quando mais pessoas usam a solução, ela se torna uma especificação padrão, que é a origem do Swagger. Através deste conjunto de especificações, você só precisa definir interfaces e informações relacionadas à interface de acordo com suas especificações. Através de uma série de projetos e ferramentas derivadas do Swagger, é possível gerar documentos de interface em vários formatos, gerar códigos de cliente e servidor em vários idiomas, páginas de depuração de interface online, etc. Desta forma, de acordo com o novo modo de desenvolvimento, ao desenvolver uma nova versão ou uma versão iterativa, você só precisa atualizar o arquivo de descrição do Swagger, e o documento de interface e o código do servidor do lado cliente podem ser gerados automaticamente, para que a chamada O código do lado do servidor, o código do lado do servidor e a interface podem ser alcançados.Consistência de documentação.
Gabarito
-
A estrutura de API mais popular do mundo
-
Gerador automático on-line do documento Restful Api => O documento da API e a definição da API são atualizados de forma síncrona
-
Execute-o diretamente, teste a API online
-
Suporta vários idiomas (por exemplo: Java, PHP, etc.)
-
Site oficial: https://swagger.io/
comece a usar
importar dependências
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
Para usar o Swagger, precisamos escrever uma classe de configuração - SwaggerConfig para configurar o Swagger
Escreva a classe SwaggerConfigl
package com.chen.config;
import jdk.nashorn.internal.ir.RuntimeNode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import sun.plugin.dom.core.Document;
import java.lang.reflect.Array;
import java.util.ArrayList;
@Configuration
@EnableSwagger2 //开启Swaqger2
public class SwaggerConfig {
//groupName()->配置多个分组
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("A");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("B");
}
//配置了swagger的Docket的bean实例
//访问路径:http://localhost:8080/swagger-ui.html#/
@Bean
public Docket docket(Environment environment) {
//设置要显示的开发者环境
Profiles profiles= Profiles.of("dev","test");
//获取项目的环境:
boolean flag= environment.acceptsProfiles(profiles);
System.out.println("==="+flag);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("C")
.enable(flag) //enable是否启动swagger,如果为false,则swagger不能再浏览器中访问
.select()
//RequestHandlerSelectors配置要扫描的接口
//basePackage:指定要扫描的包
//any():扫描全部
//none:不扫描
.apis(RequestHandlerSelectors.basePackage("com.chen.controller"))
//withClassAnnotation()扫描类上的注解,参数是一个注解的反射对象
//withMethodAnnotation()扫描方法上的注解
//.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
//paths() 过滤什么路径
//.paths(PathSelectors.ant("/chen/**"))
.build();
}
//配置Swagger信息==apiInfo
private ApiInfo apiInfo(){
//作者信息
Contact contact=new Contact("陈锦贤","url","[email protected]");
return new ApiInfo("test Swagger文档",
"Api Documentation",
"1.0",
"urn:tos",
contact,
"Apache 2.0" ,
"url",
new ArrayList());
}
}
Gravar classe de entidade: usuário
package com.chen.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
//Api(注释)
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Escreva a classe de controle: HelloController
package com.chen.controller;
import com.chen.pojo.User;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
//只有我们的接口中,返回值中存在实体类
@PostMapping("/user")
public User user(){
return new User();
}
//operation接口,不是放在实体类上,是方法
@ApiOperation("Hello控制类")
@GetMapping("/hello2")
public String hello(@ApiParam("用户名") String username){
return "hello2"+username;
}
//operation接口,不是放在实体类上,是方法
@ApiOperation("Post测试类")
@PostMapping("/hello3")
public User hello3(@ApiParam("用户名") User user){
return user;
}
}
realizar testes:
Navegador aberto: http://localhost:8081/swagger-ui.html
Clique em experimentar para testar
Finalmente, podemos importar diferentes pacotes para implementar diferentes definições de skin:
<!-- 引入swagger-bootstrap-ui包 /doc.html-->
<!-- <dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.1</version>
</dependency>-->
<!-- 引入swagger-ui-layer包 /docs.html-->
<!-- <dependency>
<groupId>com.github.caspar-chen</groupId>
<artifactId>swagger-ui-layer</artifactId>
<version>1.1.3</version>
</dependency>-->
<!-- 引入swagger-ui-layer包 /document.html-->
<!-- <dependency>
<groupId>com.zyplayer</groupId>
<artifactId>swagger-mg-ui</artifactId>
<version>1.0.6</version>
</dependency>-->
Fonte da nota: https://www.bilibili.com/video/BV1PE411i7CV?p=48