微信公众号幸运28源码下载

微信公众号幸运28源码下载

QQ1784662395

一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。

swagger是一款方便展示的API文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为。

swagger目前有两种swagger和swagger2两种,1比较麻烦,所以不考虑使用。本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅。

一、使用传统的springmvc整合swagger2

1、maven依赖

复制代码
<!--springfox依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.6.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.6.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
复制代码

2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):

<!--  swagger静态文件路径 -->
    <mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/>  
    <mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>

注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置。

3、然后是swagger2的配置类:

复制代码
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("yyblog项目 RESTful APIs")
                .description("yyblog项目api接口文档")
                .version("1.0")
                .build();
    }
}
复制代码

注意:paths如果在生产情况下可以调整为PathSelectors.none(),即不显示所有接口信息;

4、接口信息配置

即在SpringMvc的Controller中配置相关的接口信息

复制代码
@Controller
@RequestMapping(value = "aitou")
@Api(description = "测试服务-账户信息查询")
public class DailyOperationDataController {
    Logger           logger    = Logger.getLogger(DailyOperationDataController.class);
    @Autowired
    private DailyOperationDataService DailyOperationDataService;
     
    @ApiOperation(value = "账户信息查询接口")
    @RequestMapping(method ={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}")
    @ResponseBody
    public DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) {
        try {
            return DailyOperationDataService.getDailyReportByDataDate(dataDate);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        return null;
    }

}
复制代码

注:通常情况下swagger2会将扫描包下所有的接口展示出来,这里我是对外的接口是单独一个包,避免展示过多的接口,当然接口方法也可以让它不展示。可以在下面看到相关的注解中有写。

常用的一些注解

@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API

基本上就是上面这些了,是不是很easy,下面看下效果图

 

二、使用springboot整合swagger2

上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springboot的方式,其实原理都是一样的。

1、maven依赖

复制代码
<!--springfox依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
复制代码

这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0

2、添加静态资源配置

复制代码
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
     * 配置静态资源路径以及上传文件的路径
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/upload/**").addResourceLocations(environment.getProperty("spring.resources.static-locations"));
        /*swagger-ui*/
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

}
复制代码

其实就是最后两句,如果你不配置这个的话,访问swagger-ui.html会出现500,还是404的错误来着,记不清了,应该是404.

3、swagger2的配置类

和上面一样,基本上没区别

复制代码
@Configuration
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig extends WebMvcConfigurationSupport {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend"))
                .paths(PathSelectors.none())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("yyblog项目 RESTful APIs")
                .description("yyblog项目api接口文档")
                .version("1.0")
                .build();
    }


}
复制代码

注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)

4、接口的配置

复制代码
/**
 * 前台文章Controller
 * @author 小卖铺的老爷爷
 * @date 2018年5月5日
 * @website www.laoyeye.net
 */
@Api(description="文章查询")
@Controller
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    private ArticleService articleService;
    @Autowired
    private SettingService settingService;
    @Autowired
    private CateService cateService;
    @Autowired
    private TagReferService tagReferService;
    @Autowired
    private UserService userService;
    @Autowired
    private ArticleMapper articleMapper;
    @Autowired
    private CommentService commentService;
    
    @ApiOperation(value="文章查询接口")
    @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long")
    @GetMapping("/{id}")
    public String index(Model model, @PathVariable("id") Long id) {
        try {
            articleService.updateViewsById(id);
        } catch (Exception ignore) {
        }
        List<Setting> settings = settingService.listAll();
        Map<String,Object> map = new HashMap<String,Object>();
        for (Setting setting : settings) {
            map.put(setting.getCode(), setting.getValue());
        }
        Article article = articleService.getArticleById(id);
        model.addAttribute("settings", map);
        model.addAttribute("cateList", cateService.listAllCate());
        model.addAttribute("article", article);
        model.addAttribute("tags", tagReferService.listNameByArticleId(article.getId()));
        model.addAttribute("author", userService.getNicknameById(article.getAuthorId()));
        //回头改
        model.addAttribute("articles",  articleMapper.listArticleByTitle(null));
        model.addAttribute("similars", articleMapper.listArticleByTitle(null));
        CommentQuery query = new CommentQuery();
        query.setLimit(10);
        query.setPage(1);
        query.setArticleId(id);
        model.addAttribute("comments", commentService.listCommentByArticleId(query));
        return "frontend/article";
    }
    
    @ApiOperation(value="文章评论查询接口")
    @PostMapping("/comments")
    @ResponseBody
    public DataGridResult comments(CommentQuery query) {
        //设置默认10
        query.setLimit(10);
        return commentService.listCommentByArticleId(query);
    }
    
    @ApiOperation(value="文章点赞接口")
    @ApiImplicitParam(name = "articleId", value = "文章ID", required = true, dataType = "Long")
    @PostMapping("/approve")
    @ResponseBody
    public YYBlogResult approve(@RequestParam Long articleId) {
        return articleService.updateApproveCntById(articleId);
    }
}
复制代码

最后同样来个效果图,和上面一样。

 PathSelectors.none()的时候

PathSelectors.any()的时候

 看到效果图是不是接口内容一目了然,很简洁明了了。

最后,好像忘记说swagger文档的路径了


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭