`
changhongbao
  • 浏览: 123041 次
  • 性别: 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`: 描述...

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

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

    js代码-swagger 解析api-doc

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