在Spring Cloud中使用Swagger自动构建API接口文档

简介

Swagger 是一个可以用来构建API服务文档的工具,并且API文档可以和代码服务实时更新,保持一致,提供了UI界面可以直接查看文档。同时还可以进行功能测试。

在Spring Boot项目中集成使用

1.新建项目并添加相关依赖

  • Springfox-swagger2
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.4.0</version>
</dependency>
  • Springfox-swagger2-ui
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2-ui</artifactId>
    <version>2.4.0</version>
</dependency>

2.添加配置类

@EnableSwagger2
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                // 当前包路径
               .apis(RequestHandlerSelectors.basePackage("cn.leon.leonswagger.controller"))
                .paths(PathSelectors.any())
                .build();

    }
    //构建api文档的详细信息函数
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //页面标题
                .title("Leon测试Swagger")
                //创建人
                .contact(new Contact("Leon", "http://www.dujinghua.cn", ""))
                //版本号
                .version("1.0")
                //描述
                .description("API 描述")
                .build();
    }
}

3.为服务类添加注解

为提供接口服务的Controller类添加注解:@Api

@Api("swagger测试相关api")
public class LeonController {

}

4.为方法添加注解

在上面创建的LeonController类中添加方法,并在方法上添加相关注解:

/**
 * Get请求测试
 */
@ApiOperation(value = "根据id查询商品详情", notes = "查询某个商品的详细信息")
@ApiImplicitParam(name = "id", value = "商品id", paramType = "path", required = true, dataType ="String")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "用户id", dataType = "String", paramType = "path", example = "1112")
})
@ApiResponses({
        @ApiResponse(code = 500, message = "服务器内部错误"),
        @ApiResponse(code = 404, message = "找不到请求路径")
})
@RequestMapping(value = "getGoods/{id}", method = RequestMethod.GET)
public String GetGoods(@PathVariable String id) {
    return "Leon-商品ID : " + id;
}

5.访问文档

运行项目,访问地址:http://localhost:8080/swagger-ui.html 可以看到如下界面:

1.png

点击leon-controller可以看到方法的描述:

2.png

详细参数介绍

@EnableSwagger2 @Configuration

配置类需要添加的注解,声明为Swagger

@ApiOperation

指定接口方法的说明,如果方法不加此注解,说明默认为方法名称:


3.png

@ApiImplicitParams @ApiImplicitParam

接口详细描述的参数信息:


4.png

其中 ApiImplicitParam 为具体的参数,里面的配置 paramType 需要注意:

paramType代表参数放在哪个地方

  • header-->请求参数的获取:@RequestHeader
  • query-->请求参数的获取:@RequestParam
  • path(用于restful接口)-->请求参数的获取:@PathVariable
  • body(不常用)
  • form(不常用)

@ApiResponses

接口返回信息描述:


5.png

测试

除了用作静态接口文档,swagger还可以进行测试,直接看到接口调用的返回结果,在参数中输入数值,然后点击 try it out 按钮,就可以查看详细调用结果:

6.png

注:如果发现请求返回结果有问题,可以先查看请求的完整地址,是否是正确的格式

如果接口方法中不加任何描述,那么会按照方法的参数默认生成描述,并且参数都是必须的(requeired),测试的不输入参数会提示报错:


7.png

返回json数据

目前接口返回一般都是json数据,在Swagger中,可以指定返回为json格式数据,在ApiOperation注解中添加produces:

 @ApiOperation(value = "根据id查询商品详情", notes = "查询某个商品的详细信息",produces = "application/json")

然后就可以看到:


8.png

在项目中添加JSON依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>

然后返回数据时返回json格式数据:

@RequestMapping(value = "getGoods/{id}", method = RequestMethod.GET)
public String GetGoods(@PathVariable String id) {
    String info = "Leon-商品ID : " + id;
    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("info", info);
    return jsonObject.toString();
}

重新在Swagger页面中测试,可以看到返回结果为json:


9.png

在Spring Cloud项目中集成使用

在Spring Cloud中我们的服务都会注册在Eureka Server中,如下所示:


10.png

此时当我们点击红框中的服务时,返回的是空,无法查看具体的服务信息,接下来在Spring Cloud集成Swagger。
首先为注册到Eureka Server上的服务添加配置:

eureka:
  client:
    service-url:
      defaultZone: http://root:123456@localhost:7776/eureka/
  instance:
    status-page-url: http://localhost:${server.port}/swagger-ui.html

然后重启服务重新注册即可,然后在注册中心的界面,点击该服务就可以自动跳转到Swagger文档主页面

替代产品

除了使用Swagger提供项目API文档,还有其他一些不错的选择。Swagger的好处是可以根据代码变动随时更新内容并且可以测试,但是也有一些不太方便的地方:

  • 和代码耦合在一起,是代码看起来比较臃肿
  • 如果代码没有写完,那么接口文档就无法完成
  • 项目服务启动才能访问接口文档,如果是公司内网开发,离开环境就无法查看。或者后端开发停掉服务,前端开发就看不到文档了

这里介绍几种其他的接口文档方案,具体选中哪种每个团队都会有不同的选择:

Easy Mock

https://easy-mock.com/login
是一个可视化,并且能快速生成模拟数据的服务。可以在线生成模拟接口,能够随机产生数据,也支持结合Swagger使用

11.png

YApi

https://yapi.ymfe.org/
可视化操作配置,同样非常方便

12.png

RAP

http://rapapi.org/org/index.do
阿里妈妈前端团队出品的开源接口管理工具RAP第二代

13.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容