初衷

记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情。也许多点,也许少点。甚至,接口总是需要适应新需求的,修改了,增加了,这份文档维护起来就很困难了。于是发现了swagger,自动生成文档的工具。

swagger介绍

首先,官网这样写的:

Swagger – The World's Most Popular Framework for APIs.

因为自强所以自信。swagger官方更新很给力,各种版本的更新都有。swagger会扫描配置的API文档格式自动生成一份json数据,而swagger官方也提供了ui来做通常的展示,当然也支持自定义ui的。不过对后端开发者来说,能用就可以了,官方就可以了。

最强的是,不仅展示API,而且可以调用访问,只要输入参数既可以try it out.

效果为先,最终展示doc界面,也可以设置为中文:

在spring-boot中使用

以前总是看各种博客来配置,这次也不例外。百度了千篇一律却又各有细微的差别,甚至时间上、版本上各有不同。最终还是去看官方文档,终于发现了官方的sample。针对于各种option的操作完全在demo中了,所以clone照抄就可以用了。

github sample源码

配置

1.需要依赖两个包:

<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>

第一个是API获取的包,第二是官方给出的一个ui界面。这个界面可以自定义,默认是官方的,对于安全问题,以及ui路由设置需要着重思考。

2.swagger的configuration

需要特别注意的是swagger scan base package,这是扫描注解的配置,即你的API接口位置。

@Configuration@EnableSwagger2public class SwaggerConfig {public static final String SWAGGER_SCAN_BASE_PACKAGE = "com.test.web.controllers";public static final String VERSION = "1.0.0";ApiInfo apiInfo() {return new ApiInfoBuilder().title("Swagger API").description("This is to show api description").license("Apache 2.0").licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html").termsOfServiceUrl("").version(VERSION).contact(new Contact("","", "miaorf@outlook.com")).build();}@Beanpublic Docket customImplementation(){return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE)).build().directModelSubstitute(org.joda.time.LocalDate.class, java.sql.Date.class).directModelSubstitute(org.joda.time.DateTime.class, java.util.Date.class).apiInfo(apiInfo());}
}

当然,scan package 也可以换成别的条件,比如:

    @Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();}

3.在API上做一些声明

//本controller的功能描述@Api(value = "pet", description = "the pet API")
public interface PetApi {//option的value的内容是这个method的描述,notes是详细描述,response是最终返回的json model。其他可以忽略@ApiOperation(value = "Add a new pet to the store", notes = "", response = Void.class, authorizations = {@Authorization(value = "petstore_auth", scopes = {@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),@AuthorizationScope(scope = "read:pets", description = "read your pets")})}, tags={ "pet", })//这里是显示你可能返回的http状态,以及原因。比如404 not found, 303 see other@ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input", response = Void.class) })@RequestMapping(value = "/pet",produces = { "application/xml", "application/json" }, consumes = { "application/json", "application/xml" },method = RequestMethod.POST)ResponseEntity<Void> addPet(//这里是针对每个参数的描述@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @RequestBody Pet body);

案例:

package com.test.mybatis.web.controllers;import com.test.mybatis.domain.entity.City;import com.test.mybatis.domain.entity.Hotel;import com.test.mybatis.domain.mapper.CityMapper;import com.test.mybatis.domain.mapper.HotelMapper;import com.test.mybatis.domain.model.common.BaseResponse;import io.swagger.annotations.*;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.List;/** * Created by miaorf on 2016/9/10. */@Api(value = "Test", description = "test the swagger API")
@RestControllerpublic class TestController {@Autowiredprivate CityMapper cityMapper;@Autowiredprivate HotelMapper hotelMapper;@ApiOperation(value = "get city by state", notes = "Get city by state", response = City.class)@ApiResponses(value = {@ApiResponse(code = 405, message = "Invalid input", response = City.class) })@RequestMapping(value = "/city", method = RequestMethod.GET)public ResponseEntity<BaseResponse<City>>  getCityByState(@ApiParam(value = "The id of the city" ,required=true ) @RequestParam String state){City city = cityMapper.findByState(state);if (city!=null){BaseResponse response = new BaseResponse(city,true,null);return new ResponseEntity<>(response, HttpStatus.OK);}return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}@ApiOperation(value = "save city", notes = "", response = City.class)@RequestMapping(value = "/city", method = RequestMethod.POST)public ResponseEntity<BaseResponse<City>> saveCity(@ApiParam(value = "The id of the city" ,required=true ) @RequestBody City city){int save = cityMapper.save(city);if (save>0){BaseResponse response = new BaseResponse(city,true,null);return new ResponseEntity<>(response, HttpStatus.OK);}return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}@ApiOperation(value = "save hotel", notes = "", response = Hotel.class)@RequestMapping(value = "/hotel", method = RequestMethod.POST)public ResponseEntity<BaseResponse<Hotel>> saveHotel(@ApiParam(value = "hotel" ,required=true ) @RequestBody Hotel hotel){int save = hotelMapper.save(hotel);if (save>0){BaseResponse response = new BaseResponse(hotel,true,null);return new ResponseEntity<>(response, HttpStatus.OK);}return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}@ApiOperation(value = "get the hotel", notes = "get the hotel by the city id", response = Hotel.class)@RequestMapping(value = "/hotel", method = RequestMethod.GET)public ResponseEntity<BaseResponse<Hotel>> getHotel(@ApiParam(value = "the hotel id" ,required=true ) @RequestParam Long cid){List<Hotel> hotels = hotelMapper.selectByCityId(cid);return new ResponseEntity<>(new BaseResponse(hotels,true,null), HttpStatus.OK);}@ApiOperation(value = "update the hotel", notes = "update the hotel", response = Hotel.class)@RequestMapping(value = "/hotel", method = RequestMethod.PUT)public ResponseEntity<BaseResponse<Hotel>> updateHotel(@ApiParam(value = "the hotel" ,required=true ) @RequestBody Hotel hotel){int result = hotelMapper.update(hotel);return new ResponseEntity<>(new BaseResponse(result,true,null), HttpStatus.OK);}@ApiOperation(value = "delete the  hotel", notes = "delete the hotel by the hotel id", response = City.class)@RequestMapping(value = "/hotel", method = RequestMethod.DELETE)public ResponseEntity<BaseResponse<Hotel>> deleteHotel(@ApiParam(value = "the hotel id" ,required=true ) @RequestParam Long htid){int result = hotelMapper.delete(htid);return new ResponseEntity<>(new BaseResponse(result,true,null), HttpStatus.OK);}}

4.设定访问API doc的路由

在配置文件中,application.yml中声明:

springfox.documentation.swagger.v2.path: /api-docs

这个path就是json的访问request mapping.可以自定义,防止与自身代码冲突。

API doc的显示路由是:http://localhost:8080/swagger-ui.html

如果项目是一个webservice,通常设定home / 指向这里:

@Controllerpublic class HomeController {@RequestMapping(value = "/swagger")public String index() {System.out.println("swagger-ui.html");return "redirect:swagger-ui.html";}
}

5.访问

就是上面的了。但是,注意到安全问题就会感觉困扰。首先,该接口请求有几个:

http://localhost:8080/swagger-resources/configuration/ui
http://localhost:8080/swagger-resources
http://localhost:8080/api-docs
http://localhost:8080/swagger-resources/configuration/security

除却自定义的url,还有2个ui显示的API和一个安全问题的API。关于安全问题的配置还没去研究,但目前发现一个问题是在我的一个项目中,所有的url必须带有query htid=xxx,这是为了sso portal验证的时候需要。这样这个几个路由就不符合要求了。

如果不想去研究安全问题怎么解决,那么可以自定ui。只需要将ui下面的文件拷贝出来,然后修改请求数据方式即可。

参考:

1.swagger官网:http://swagger.io/
2.github: https://github.com/swagger-api/swagger-codegen/blob/master/samples/server/petstore/springboot/src/main/java/io/swagger/api/PetApi.java
3.后续阅读文章:

  • http://yukinami.github.io/2015/07/07/%E4%BD%BF%E7%94%A8springfox%E7%94%9F%E6%88%90springmvc%E9%A1%B9%E7%9B%AE%E7%9A%84swagger%E7%9A%84%E6%96%87%E6%A1%A3/
  • http://www.aichengxu.com/view/2500558
来源: http://www.cnblogs.com/woshimrf/p/5863318.html
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/jeffen/p/6182279.html

使用swagger作为restful api的doc文档生成相关推荐

  1. 使用swagger作为restful api的doc文档生成——从源码中去提取restful URL接口描述文档...

    初衷 记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情.也许多点,也许少点.甚至,接口总是需要适应新需求的,修改了,增加了,这份 ...

  2. RESTful API 设计、文档生成、测试

    参考资料 理解RESTful架构 RESTful API 设计指南 REST API 使用详解 文档工具 API Blueprint RAML Swagger ReadMe Mock API JSON ...

  3. 将doc文档生成html页面

    小编在参与某个项目的时候,产品经理要求将产品的操作指南生成html页面的形式直接以链接的形式在管理后台中进行查看,当听到这个要求时小编是相当头疼啊,产品的操作指南将近百来页,不可能手动一页页做成htm ...

  4. 【API】apidoc文档生成

    1.首先要确认你的系统安装了nodejs,然后执行npm install -g apidoc即可. https://blog.csdn.net/oqqHun123/article/details/88 ...

  5. Node与apidoc的邂逅——NodeJS Restful 的API文档生成

    作为后台根据需求文档开发完成接口后,交付给前台(angular vue等)做开发,不可能让前台每个接口调用都去查看你的后台代码一点点查找.前台开发若不懂你的代码呢?让他一个接口一个接口去问你怎么调用, ...

  6. 文档生成组件工作估算

    笔者最近做一个系统的工作量预估,其中包含一个通用组件,文档生成组件的工作量预估,在此分享下. 功能要求:通过定制文档模板,依据设置的文档数据,抽取数据或图表,生成文档,记录所有生成文档,实现文档查询. ...

  7. 导出word文档生成docx格式 添加水印

    为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便. <!-- https://mvnrepository.com/artifact/freema ...

  8. java smart算法_Java Restful API 文档生成工具 smart-doc

    谁说生成api文档就必须要定义注解? 谁说生成接口请求和返回示例必须要在线? 用代码去探路,不断尝试更多文档交付的可能性. 如果代码有生命,为什么不换种方式和它对话! 一.背景 没有背景.就自己做自己 ...

  9. 扔掉Swagger,试试这款功能强大,零注解侵入的API接口文档生成工具!

    欢迎关注方志朋的博客,回复"666"获面试宝典 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-d ...

最新文章

  1. ASP.NET 4的Demo实践:URL路由改进支持
  2. 洛谷 P1049 装箱问题(01背包)
  3. [原创]windows server 2012 AD架构 试验 系列 – 5 AD备份与还原
  4. Boost:使用/type <>语法测试功能对象
  5. django使用bootstrap快速美化 admin后台
  6. 通过查看__cplusplus的值查看编译器的C++标准
  7. W3 Total Cache+Hacklog Remote Attachment Upyun
  8. 计算机英语input,人教版高中英语选修计算机英语VoiceInput.ppt
  9. python 单例类
  10. 微服务化的基石--持续集成
  11. Hadoop学习笔记(一):MapReduce工作机制
  12. 更新maven卡在18不动_Android Studio maven-metadata.xml 卡着不动原因和解决方法
  13. java 重定向和转发的区别
  14. 学计算机信息管理专业的感谢,2014年计算机信息管理专业自荐信
  15. VMware Workstation 16.1 macOS unlocker 3.0.3
  16. 【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接
  17. 计算机网络期中考试总结反思,期中考试总结反思
  18. 打印机扫描显示服务器拒绝访问,打印机拒绝访问,教您打印机拒绝访问怎么解决...
  19. mac 显示器分辨率_如何在Mac上选择精确的显示分辨率
  20. 优雅地使用 C++ 制作表格:tabulate

热门文章

  1. python 编程服务_Python编写Windows Service服务程序
  2. 微服务springCloud初识
  3. 永恒python配合什么主武器_让Python代码更易维护的七种武器
  4. kali卸载firefox_kali 安装最新firefox的悲惨经历
  5. 第三方软件源_最强软件管家!要啥有啥,吊打全网~
  6. 怎么导入sklearn包_4.5包
  7. 向量二次规划matlab,MATLAB中使用Opti Toolbox的混合整数二次规划
  8. vue 实现文本的拖拽_基于Vue实现拖拽功能
  9. python附加索引_python – 附加两个多索引的pandas数据帧
  10. 2,8,10,16进制转换