微服务文档输出

Swagger是一款可以用于设计、构建、文档并且执行API的框架。使用框架,可以轻松的创建一个API文档。使用Swagger有利于前后端分离开发,并且在测试的时候不需要在使用浏览器输入URL的方式访问Controller,可以直接在页面输入参数,然后单击按钮来访问。而且传统的输入URL测试方式对于post请求的传参比较麻烦。

  • 如何使用Swagger
  • 搭建项目框架

pom.xml文件,该文件完整内容如下

  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.microservice</groupId>
  <artifactId>firstboot</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>firstboot Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <!-- 引入spring boot的依赖 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <springfox.version>2.5.0</springfox.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.8</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
</dependency>
  </dependencies>


  <!-- 添加spring-boot的maven插件 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin> 
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>3.1</version>  
            <configuration>  
            <source>1.8</source>  
            <target>1.8</target>  
            <encoding>UTF-8</encoding>  
            </configuration>  
        </plugin>  
    </plugins>
  </build>
</project>

要使用Swagger,首先要引入两个依赖:springfox-swagger2和springfox-swagger-ui。除了必须的两个依赖外,还引入了lombok的依赖。lombok是一个主要用来消除pojo模板试代码(例如getter、setter等)的框架,当然也可以做一些其他事情。需要注意的是,无论是Eclipse还是IDEA想使用lombok,都要安装lombok插件。

在创建好pom.xml文件之后,开始创建主类,主类Application代码如下:

   package com.microservice.firstboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2  //启动 Swagger
public class Application {
public static void main(String[] args){
    SpringApplication.run(Application.class, args);
    }
}

在该类中除了@SpringBootApplication注解外,还添加了@EnableSwagger2注解,启动Swagger

为了全面的看到Swagger的各种使用方式,这里创建一个模型类com.microservice.firstboot.model.User 代码如下:

 package com.microservice.firstboot.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;

@ApiModel("用户模型")
@AllArgsConstructor
@Getter
public class User {
@ApiModelProperty("用户ID")
private int id;
@ApiModelProperty("用户姓名")
private String name;
@ApiModelProperty("用户密码")
private String password;

}

在该模型中使用了4个注解,分别如下:

  • @Getter:是一个Lombok注解,用来为pojo类生成getter方法。如果不添加该注解,我们需要为pojo类生成getter方法,如果一个模型中属性较多,代码就不够简洁。
  • @AllArgsConstructor:是一个Lombok注解,用来为pojo生成全参构造器
  • @ApiModel:是一个Swagger注解,用来为pojo类做注释
  • @ApiModelProperty:是一个Swagger注解,用来为pojo类中属性做注释

核心代码:

   package com.microservice.firstboot.controller;
import com.microservice.firstboot.model.User;
import com.microservice.firstboot.model.Address;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Api("User 相关api")
@RestController
@RequestMapping("/user")
public class FirstSwaggerController {
@ApiOperation("根据ID获得用户信息")
@ApiImplicitParams({
    @ApiImplicitParam(paramType="query",name="id",dataType="int",required=true,value="用户的id",defaultValue="1")
})
@ApiResponses({
    @ApiResponse(code=400,message="请求参数没填好"),
    @ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
})
@RequestMapping(value="/getUserInfo",method=RequestMethod.GET)
public User getUserInfo(@RequestParam("id")int id){
    if(id==1){
        return new User(1,"小红","123456");
    }
    return new User(2,"小刚","123456");
}


@ApiOperation("根据ID获得用户住址")
@ApiImplicitParams({
    @ApiImplicitParam(paramType="query",name="id",dataType="int",required=true,value="用户的id",defaultValue="1")
})
@ApiResponses({
    @ApiResponse(code=400,message="请求参数没填好"),
    @ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
})
@RequestMapping(value="/getUserAddress",method=RequestMethod.GET)
public Address getUserAddress(@RequestParam("id")int id){
    if(id==1){
        return Address.builder().province("福建省").city("福州市").country("鼓楼区").build();//new User(1,"小红","123456");
    }
    return Address.builder().province("浙江省").city("杭州市").country("余杭区").build();
    }
}

在该controller中,提供了一个简单的接口:根据id获取User。

  • @Api:通常用来为一个controller类做注释
  • @ApiOperation:通常用来为接口做注释,说明该接口的职能
  • @ApiImplicitParams:用来包含接口的一组参数注解,可以将其简单的理解为参数注解的集合
  • @ApiImplicitParam:用在@ApiImplicitParams注解中,说明一个请求参数的各个方面。该注解常用选项如下:
  • paramType,参数放置的位置,包含query、header、path、body、及form,最常用的是前4个。需要注意的是,query域中的值需要使用@RequestParam获取,path域中的值需要使用@pathVariable获取,body域中的值需要使用@RequestBody获取,否则可能出错。

  • name,参数名

  • dataType,参数类型

  • required,参数是否必须传

  • value ,参数的值

  • defaultValue ,参数的默认值

  • @ApiResponses:通常用来包含接口的一组响应注解,可以将其简单的理解为响应注解的集合

  • @ApiResponse:用在@ApiResponses中,一般用来表达一个错误的响应信息

    • code http中code数字,例如400
    • message 信息,例如请求参数没填好

这些注解就是开发中常用的注解:到此Spring Boot与Swagger的集成就完成了。

测试分析Swagger生成的API文档:
启动项目后,浏览器输入 http://localhost:8080/swagger-ui.html#/
使用Swagger进行接口调用如图

Swagger文档

点个关注呗,我负责写,你负责看。


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

推荐阅读更多精彩内容