Swagger 最全使用教程

概述:

我的理解是通过注解的方式生成接口文档。
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。它可以在修改代码的同时同步修改接口文档,一个最大的优点是能实时同步api与文档。别的不多说,开始教程!!!

Begin

添加依赖

		<!-- swagger jar -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swagger-ui jar -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

第一个是用于API文档的生成,第二个是用于展示文档的UI界面

配置

直接上代码,代码里有说明:

package com.swagger.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


/**
 * @author Shuoshi.Yan
 * @package:com.swagger.demo.config
 * @className:swagger配置类
 * @description:
 * @date 2019-12-04 15:23
 * @version:V1.0
 * @NOTICE:本内容仅限于xxx有限公司内部传阅,禁止外泄以及用于其他的商业项目
 * @ Copyright  xxx. All rights reserved.
 **/
@Configuration
//开启swagger
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi(){
        //版本类型是swagger2
        return new Docket(DocumentationType.SWAGGER_2)
                //通过调用自定义方法apiInfo,获得文档的主要信息
                .apiInfo(apiInfo())
                .select()//通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现
                .apis(RequestHandlerSelectors.basePackage("com.swagger.demo.controller"))//扫描该包下面的API注解
                .paths(PathSelectors.any())
                .build();
    }
    //API相关信其他息
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("接口服务文档") //接口管理文档首页显示
                .description("接口服务文档")//API的描述
               // .termsOfServiceUrl("www.baidu.com")//网站url等
                .version("1.0")
                .build();
    }
}

然后看一下配置文件:

server.port=9090
server.servlet.context-path=/swagger
#启用swagger
swagger.enable=true

在这里启动swagger,在生产环境中需要禁用,设置程false

controller层

package com.swagger.demo.controller;

import com.swagger.demo.io.CityIO;
import com.swagger.demo.result.CityResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

/**
 * @author Shuoshi.Yan
 * @package:com.swagger.demo.test
 * @className:
 * @description:
 * @date 2019-12-04 10:39
 * @version:V1.0
 * @NOTICE:本内容仅限于xxx有限公司内部传阅,禁止外泄以及用于其他的商业项目
 * @ Copyright  xxx. All rights reserved.
 **/
@RestController
@RequestMapping("/yss")
@Api(tags = "城市",description = "城市")
public class SwaggerController {

    @GetMapping("/get")
    @ApiOperation(value = "根据id查询城市名称",notes = "根据id查询城市名称",response = String.class)
    public String getTest(@ApiParam(name = "城市id",value = "id",required = false) @RequestParam(value = "id",required = false)String id){
        return "this is BeiJing!";
    }

    @PostMapping("/post")
    @ApiOperation(value = "城市简介",notes = "城市简介",response = CityResult.class)
    public CityResult postTest(@ApiParam(required = true) @RequestBody CityIO cityIO){
        CityResult cityResult = new CityResult();
        return cityResult;
    }
}

CityIO

package com.swagger.demo.io;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @author Shuoshi.Yan
 * @package:com.swagger.demo
 * @className:
 * @description:
 * @date 2019-12-04 15:55
 * @version:V1.0
 * @NOTICE:本内容仅限于xxx有限公司内部传阅,禁止外泄以及用于其他的商业项目
 * @ Copyright  xxx. All rights reserved.
 **/
@Data
@ApiModel(value = "CityIO参数说明",description = "CityIO参数说明")
public class CityIO {
    @ApiModelProperty(value = "城市id")
    private String id;
    @ApiModelProperty(value = "城市位于南方北方 1/南方 2/北方")
    private String position;
}

一些注解说明

对这些常用的注解及元素说明,具体的其他元素可以查看源码。

  • @Api:用在类上
    - tags:描述类的用途
    - description:注释说明这个类
    - 其实tags和description这俩都差不多都是对这个类的说明
    在这里插入图片描述
    在这里插入图片描述

  • @ApiOperation:用在方法上
    - value:字段说明
    - notes:注释说明
    - response:方法的返回类型
    在这里插入图片描述
    在这里插入图片描述

  • @ApiParam:用在参数上
    - name:参数名称
    - required:是否必传
    在这里插入图片描述

  • @ApiModel:用在入参或回参的对象类上
    - value:对这个类进行说明
    - description:说明这个类
    - 和@Api的tags/description一样,都是起说明作用
    在这里插入图片描述

  • @ApiModelProperty:用在对象类中的变量上
    - value:对这个字段的说明
    - example:字段举例
    在这里插入图片描述

  • @EnableSwagger2:配置swagger时启用swagger
    在这里插入图片描述
    到这里,就可以在代码中简单使用swagger,访问地址(http://localhost:9090/swagger/swagger-ui.html),但是作为励志成为技术大牛的菜鸟,这点那肯定是不能够满足我的,既然知道了使用,那么swagger时怎么导出的呢,这是个大问题,在这里我在网上学习了两种方式进行导出,分别问使用maven和代码方式,但是使用maven导出的时候频频出错,没办法我只有自己找问题改代码了,代码中可能有待优化的部分,不喜勿怪!

生成并导出文档

这里提供导出两种格式:html和pdf,对了还有本身的adoc格式
直接上代码:

方式一:代码方式

package com.swagger.demo;

import io.github.swagger2markup.GroupBy;
import io.github.swagger2markup.Language;
import io.github.swagger2markup.Swagger2MarkupConfig;
import io.github.swagger2markup.Swagger2MarkupConverter;
import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder;
import io.github.swagger2markup.markup.builder.MarkupLanguage;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Paths;

@SpringBootTest
class DemoApplicationTests {
	//这里是你访问的swagger地址的/v2/api-docs地址,直接把swagger后面改成/v2/api-docs就行了
    private static final String url = "http://localhost:9090/swagger/v2/api-docs";

    //生成AsciiDocs格式文档
    @Test
    public void generateAsciiDocs() throws Exception {
        //    输出Ascii格式
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL(url))
                .withConfig(config)
                .build()
                .toFolder(Paths.get("src/docs/asciidoc/adoc"));
    }
    //生成Markdown格式文档
    @Test
    public void generateMarkdownDocsToFiles() throws Exception {
        //    输出Markdown到单文件
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.MARKDOWN)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL(url))
                .withConfig(config)
                .build()
                .toFolder(Paths.get("src/docs/asciidoc/mark"));
    }
    //生成AsciiDocs格式文档,并汇总成一个文件
    @Test
    void contextLoads() throws MalformedURLException {
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL(url))
                .withConfig(config)
                .build()
                .toFile(Paths.get("src/docs/asciidoc/adocs"));
        System.out.println(System.getProperty("user.dir"));
    }

    //生成Markdown格式文档,并汇总成一个文件
    @Test
    public void generateMarkdownDocsToFile() throws Exception {
        //    输出Markdown到单文件
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.MARKDOWN)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL(url))
                .withConfig(config)
                .build()
                .toFile(Paths.get("src/docs/asciidoc/mark"));
    }

}

在这里我比较喜欢最后两个,因为只生成一个文档,方便快捷。说一下我在这里出现的错误:Paths.get("src/docs/asciidoc/adocs")
这个路径是你的导出路径,其实我是不想写这个问题的,但是想想还是写吧,错误谁没犯过,贼尴尬;在这里不要写成"/src",不要加"/",不要加"/",不要加"/",加了之后就找不到文件夹了,导致导不出来。

System.getProperty("user.dir")
这个是输出当前路径的,可以直接忽略、略过

方式二:

在pom.xml中进行配置:
代码:

  1. <dependencies>中添加如下配置
<!--导出接口文档-->
        <dependency>
            <groupId>io.github.swagger2markup</groupId>
            <artifactId>swagger2markup</artifactId>
            <version>1.3.1</version>
        </dependency>
  1. <plugins>中添加插件配置,需要添加两个,先说第一个
    Number.1
 <!-- swagger接口导出第一步必须确认系统的 /v2/api-docs 接口可用  -->
            <plugin>
                <groupId>io.github.swagger2markup</groupId>
                <artifactId>swagger2markup-maven-plugin</artifactId>
                <version>1.3.1</version>
                <configuration>
                    <!-- api-docs访问url -->
                    <swaggerInput>http://localhost:9090/swagger/v2/api-docs</swaggerInput>
                    <!-- 生成为单个文档,输出路径 最后一个/asciidoc 为文件名不是路径-->
                    <outputFile>src/docs/asciidoc/asciidoc</outputFile>
                    <!-- 生成为多个文档,输出路径 -->
                    <!--<outputDir>src/docs/asciidoc</outputDir>-->
                    <config>
                        <!-- 输出文件语言:wiki格式文档 -->
                        <!--<swagger2markup.markupLanguage>CONFLUENCE_MARKUP</swagger2markup.markupLanguage> -->
                        <!-- 输出文件语言:ascii格式文档 -->
                        <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>
                        <!-- 输出文件语言:markdown格式文档 -->
                        <!--<swagger2markup.markupLanguage>MARKDOWN</swagger2markup.markupLanguage>-->
                        <!--目录的展现方式-->
                        <!--<swagger2markup.pathsGroupedBy>TAGS</swagger2markup.pathsGroupedBy>-->
                    </config>
                </configuration>
            </plugin>

具体说明代码里有。总的来说这个配置是导出swagger本身的adoc文件的,adoc文件时生成html和pdf文件的关键,html和pdf都是在adoc的基础上生成的,生成此文件的命令:mvn swagger2markup:convertSwagger2markup
还有 </outputFile><outputDir>这两个控制生成是控制这个项目只生成一个总的文件,还是每个类都生成一个文件,在你想转换生成是单个还是多个文件时候要重新启动项目并重新调用mvn swagger2markup:convertSwagger2markup命令,在后面会具体说明操作流程,各位莫急。

Number.2
第二个是html和pdf插件的配置

 <!--生成HTML和PDF的插件-->
            <!--  命令 mvn asciidoctor:process-asciidoc -->
            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>1.5.6</version>

                <!--pdf-->
                <dependencies>
                    <dependency>
                        <groupId>org.asciidoctor</groupId>
                        <artifactId>asciidoctorj-pdf</artifactId>
                        <version>1.5.0-alpha.10.1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jruby</groupId>
                        <artifactId>jruby-complete</artifactId>
                        <version>1.7.21</version>
                    </dependency>
                </dependencies>
                <!--html-->
                <configuration>
                    <!--需要生成格式的文件位置-->
                    <sourceDirectory>src/docs/asciidoc</sourceDirectory>
                    <!--生成格式文件的存放位置-->
                    <outputDirectory>src/docs/html</outputDirectory>
                    <!--生成文件的格式-->
                    <backend>html</backend>
                    <sourceHighlighter>coderay</sourceHighlighter>
                    <attributes>
                        <!--菜单栏在左边-->
                        <toc>left</toc>
                    </attributes>
                </configuration>
                <!--pdf-->
                <!--<configuration>-->
                    <!--<sourceDirectory>src/docs/asciidoc</sourceDirectory>-->
                    <!--<outputDirectory>src/docs/pdf</outputDirectory>-->
                    <!--<backend>pdf</backend>-->
                    <!--<sourceHighlighter>coderay</sourceHighlighter>-->
                    <!--<attributes>-->
                        <!--<toc>left</toc>-->
                    <!--</attributes>-->
                <!--</configuration>-->
            </plugin>

在这里是把生成html格式的注释掉了,若你想生成html只需要注释掉pdf并打开html就哦了
具体说一下
<sourceDirectory>src/docs/asciidoc</sourceDirectory>这个是adoc的位置,不要设置错了,如果设置错误了导不出来文档,你就一行一行找代码吧
好了,接下来开始生成,激动人心的时刻到了:

方式一操作说明

方式一没啥操作说明,真的,相信我,点击运行就哦了。
为啥要写这个菜单呢,主要是因为直接写"方法二的操作说明"你没感觉到很是突兀吗,所以没办法只能写一个"方式一操作说明"

方式二操作说明

  1. 首先在项目的根目录打开cmd:我截了个图,怕有的同行不知道在哪里
  2. 在这里插入图片描述
    就在这里打开cmd
  3. 输入mvn swagger2markup:convertSwagger2markup命令回车
    在这里插入图片描述
    如果看到这个绿绿的SUCCESS 那么恭喜你最关键的一步生成adoc成功了
    到项目中看一下就有了adoc文件:
    在这里插入图片描述
  4. 我用的是idea开发工具,我就使用idea说明接下来的流程了,打开:Terminal 一般情况下是在左下角
    在这里插入图片描述
  5. 输入命令 ```mvn asciidoctor:process-asciidoc`` 这个命令就是最后一步,生成html或pdf
    在这里插入图片描述
    如果看见绿绿的SUCCESS 再一次恭喜你swagger生成文档你~学会了
    我的生成文件:
    在这里插入图片描述
    若想需要完整项目可以进行下载:
    https://download.csdn.net/download/y368769/12014989

感谢支持!!!

Swagger是一个用于设计、构建和文档化RESTful Web服务的开源工具集。下面是一个简单的Swagger使用教程: 1. 安装Swagger:可以通过npm、pip等包管理工具安装Swagger相关的库和工具。例如,对于Node.js项目,可以使用以下命令安装swagger-jsdoc和swagger-ui-express: ```bash npm install swagger-jsdoc swagger-ui-express ``` 2. 编写Swagger注解:在你的API代码中,使用Swagger注解来描述API的信息、请求和响应参数等。以下是一个示例: ```javascript /** * @swagger * /api/users: * get: * summary: 获取所有用户 * description: 获取所有用户列表 * responses: * 200: * description: 成功获取用户列表 * schema: * type: array * items: * $ref: '#/definitions/User' */ ``` 在这个示例中,我们使用了Swagger注解来描述一个GET请求,它可以获取所有用户的列表。 3. 生成Swagger文档:使用Swagger注解编写完API代码后,可以使用相应的工具将这些注解转换为Swagger文档。例如,对于Node.js项目,我们可以使用swagger-jsdoc库生成Swagger文档。在项目的入口文件中添加以下代码: ```javascript const swaggerJSDoc = require('swagger-jsdoc'); const swaggerUi = require('swagger-ui-express'); const options = { definition: { openapi: '3.0.0', info: { title: 'API文档', version: '1.0.0', }, }, apis: ['./path/to/api/controllers/*.js'], // API代码文件的路径 }; const swaggerSpec = swaggerJSDoc(options); app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); ``` 这段代码将会在`/api-docs`路径下提供Swagger文档。 4. 查看Swagger文档:运行项目并访问`/api-docs`路径,你将会看到生成的Swagger文档。Swagger提供了一个交互式的UI界面,可以方便地查看API的信息、请求和响应参数等。 这只是一个简单的Swagger使用教程,你可以根据自己的项目需求进一步深入学习和使用Swagger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值