`
changhongbao
  • 浏览: 123430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用swagger作为restful api的doc文档生成

阅读更多

初衷

记得以前写接口,写完后会整理一份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
@EnableSwagger2
public 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();
    }

    @Bean
    public 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 也可以换成别的条件,比如:

 

 

@Bean
    public 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")
@RestController
public class TestController {

    @Autowired
    private CityMapper cityMapper;
    @Autowired
    private 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 / 指向这里:

@Controller
public 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下面的文件拷贝出来,然后修改请求数据方式即可。

So do it,and change it,no regret!
分享到:
评论

相关推荐

    swagger:使用 Swagger 2.0 自动生成 RESTful API 文档的 Iris 中间件

    用于 Iris Web 框架的 Swagger 中间件可按照要求使用 Swagger 2.0 自动生成 RESTful API 文档。用法开始使用它向您的 API 源代码添加注释,。 使用以下命令下载 for Go:$ go get -u github....

    gin-swagger:使用 Swagger 2.0 自动生成 RESTful API 文档的 gin 中间件

    gin 中间件使用 Swagger 2.0 自动生成 RESTful API 文档。 用法 开始使用它 向您的 API 源代码添加注释,。 使用以下命令下载 for Go: $ go get -u github.com/swaggo/swag/cmd/swag 在包含main.go文件的 Go 项目...

    swagger生成html离线接口文档

    Swagger UI是一个基于Web的工具,它可以解析Swagger Spec文件并生成用户友好的接口文档,用户可以通过它来浏览、测试和理解API。 Spring Boot与Swagger 2的集成使得在Java环境中使用Swagger变得更加简单。`...

    swagger在线api文档搭建指南.doc

    8. Swagger在线API文档搭建指南的好处:Swagger在线API文档搭建指南可以帮助开发者快速生成API文档,提高开发效率、降低维护成本、提供良好的API使用体验等。 9. API设计的重要性:API设计是API的核心组成部分,它...

    swagger2doc接口word文档生成器,非官方样式

    4. 运行转换:使用Swagger2Doc命令行工具,指定Swagger规格文件和自定义模板,生成Word文档。命令可能类似于`swagger2doc -i your-swagger-file.yaml -t custom-template.dotx -o output.docx`。 5. 检查和分发:...

    Swagger 自定义UI界面.doc

    Swagger 是一个流行的 API 文档生成工具,能够自动生成 RESTful API 的文档,帮助开发者快速了解 API 的使用方法和参数信息。在本文中,我们将讨论如何使用 Swagger 在 Spring Boot 2.0 项目中自定义 UI 界面,以...

    swagger在线文档转成word文档

    Swagger是一款流行的API文档框架,常用于构建RESTful API的交互式文档。SpringBoot是Java开发者的常用框架,它简化了Spring应用的初始搭建以及开发过程。本篇文章将详细讲解如何在SpringBoot项目中利用Swagger生成的...

    swagger-word文档生成程序.rar

    Swagger 是一个广泛使用的开源工具,主要用于构建、设计和文档化 RESTful API。它提供了一种标准的、人类可读的、机器可解析的方式来定义和理解API。Swagger JSON 格式是一种基于OpenAPI Specification (OAS) 的规范...

    Swagger接口导出Word.rar

    Swagger是一个流行的API文档工具,它允许开发者以结构化的方式定义和文档化RESTful API。在.NET环境中,Swagger(也称为Swashbuckle)为ASP.NET Web API提供了强大的支持,包括生成交互式的API文档。本教程将围绕...

    fiber-swagger:光纤中间件可通过Swagger 2.0自动生成RESTful API文档

    光纤中间件,以使用Swagger 2.0自动生成RESTful API文档。 用法 开始使用它 将注释添加到您的API源代码中,。 使用以下方法下载 for Go: $ go get -u github.com/swaggo/swag/cmd/swag 在包含main.go文件的Go项目...

    echo-swagger:回声中间件,以使用Swagger 2.0自动生成RESTful API文档

    回声摇摆echo中间件,以使用Swagger 2.0自动生成RESTful API文档。用法开始使用它将注释添加到您的API源代码中,。 使用以下方法下载 for Go:$ go get github.com/swaggo/swag/cmd/swag 在包含main.go文件的Go项目...

    PyPI 官网下载 | flask-restful-swagger-3-0.2.0.tar.gz

    使用Flask-Restful-Swagger-3,开发者只需在资源类上添加`@swagger.model`和`@api.representation`等装饰器,即可自动为API接口生成详细文档。同时,`@api.doc`装饰器可以用来添加额外的描述信息,使API接口的意图...

    SwaggerToWord的json生成word或者html

    要使用SwaggerToWord,首先你需要有一个符合Swagger规范的JSON文件,这通常是由Swagger Editor或Swagger UI生成的。JSON文件包含以下关键元素: 1. `swagger`: 版本号,例如`"swagger": "2.0"`。 2. `info`: 描述...

    js代码-swagger 解析api-doc

    Swagger 是一个广泛使用的开源工具,用于设计、构建、文档化和使用 RESTful 风格的 Web 服务。它提供了一种标准的方式来描述 API,使得开发者可以更容易地理解和使用这些接口。在 JavaScript 开发中,Swagger 也发挥...

    swagger文档离线导出,word、pdf、html

    Swagger 是一个广泛使用的 API 设计和文档工具,它允许开发者以结构化的方式定义 RESTful API,使得服务接口清晰易懂,同时提供了一种交互式的 API 文档系统,方便开发者测试和理解 API 功能。Swagger 文档离线导出...

    java 自己的doc文件生成 api说明文档工具

    标题提到的"java 自己的doc文件生成 api说明文档工具"是指使用JavaDoc生成CHM(Compiled Help Manual)文件的工具。CHM是一种Windows平台上的帮助文件格式,它将多个HTML页面压缩到一个单一的文件中,便于查看和分发...

    swagger所需文件

    Swagger是一款广泛使用的API文档工具,它能够帮助开发者创建、设计、文档化以及测试RESTful API。Swagger通过一种标准的、语言无关的方式描述了API,使得API的使用者可以快速理解其功能,并能通过Swagger UI直接进行...

    swagger-ui

    Swagger UI 是一个强大的工具,主要用于构建交互式的API文档,它基于OpenAPI规范,使得开发者能够以用户友好的方式展示和测试RESTful API。这个工具极大地简化了API接口的文档化和测试过程,使得非开发人员也能理解...

    http-swagger:默认的nethttp包装器,可通过Swagger 2.0自动生成RESTful API文档

    默认的net / http包装器,可通过Swagger 2.0自动生成RESTful API文档。 用法 开始使用它 将注释添加到您的API源代码中,。 使用以下方法下载 for Go: $ go get github.com/swaggo/swag/cmd/swag 在包含main.go...

    swagger2word:一个Swagger API 文档 转 Word 文档的工具项目

    swagger2Word 提供了多种方式生成 word 文档,可以通过 swagger json 的资源地址,例如: ;可以通过上传 json 文件;甚至可以直接输入 json 字符串。 生成的 WORD 示例: --------------版本迭代历程,感谢各位小...

Global site tag (gtag.js) - Google Analytics