当前位置: 首页 > 编程日记 > 正文

MP实战系列(二)之集成swagger

其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写。

提到swagger不得不提rest,rest是一种架构风格,里面有对不同的资源有不同的请求标识。例如PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH等。

对于技术的初学,最好的话还是建议去官网,官网最详细也最权威,虽然不少博客对此有挺好的解说,但还是强烈建议去官网,不要求仔仔细细阅读,至少读个大概。

对于目前,有人要问我swagger能做什么,可以解决什么问题?我不能详细的给你一一道来,因为我对此不是十分精通,至少它解决了我两个问题,第一个,接口文档的编写,之前通过接口文档,但是随着后续接口是越来越多,文档也需要变来变去,本来就力不从心,又是一大堆接口要写,又是文档要写,swagger就可以轻松的解决这个问题,通过swagger注解可以让安卓方面清楚看到这个接口的作用是什么,还可以在线测试,返回数据;第二个问题,就是接口管理,通过swagger我可以根据接口类型,比如有用户管理,文章管理等等,我通过swagger注解可以轻松的给它们分累以方便我下次编写或修改。

pom依赖:

    <!-- swagger -->  <dependency>    <groupId>com.mangofactory</groupId>    <artifactId>swagger-springmvc</artifactId> <version>1.0.2</version>    </dependency> 

就是上述这一个,我的MP实战系列(一)中pom就有这个。

要集成swagger导入上述的依赖之外,还要添加一个类并在springmvc.xml中配置

    <!-- 将 springSwaggerConfig加载到spring容器 -->  <bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />  <!-- 将自定义的swagger配置类加载到spring容器 -->  <bean class="com.lms.swagger.SwaggerConfig" />   

SwaggerConfig.java

package com.lms.swagger;import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Bean;  import com.mangofactory.swagger.configuration.SpringSwaggerConfig;  
import com.mangofactory.swagger.models.dto.ApiInfo;  
import com.mangofactory.swagger.plugin.EnableSwagger;  
import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;  @EnableSwagger  
public class SwaggerConfig {  private SpringSwaggerConfig springSwaggerConfig;  /** * Required to autowire SpringSwaggerConfig */  @Autowired  public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig)  {  this.springSwaggerConfig = springSwaggerConfig;  }  /** * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc * framework - allowing for multiple swagger groups i.e. same code base * multiple swagger resource listings. */  @Bean  public SwaggerSpringMvcPlugin customImplementation()  {  return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)  .apiInfo(apiInfo())  .includePatterns(".*?");  }  private ApiInfo apiInfo()  {  ApiInfo apiInfo = new ApiInfo(  "springmvc搭建swagger",  "spring-API swagger测试",  "My Apps API terms of service",  "19****81**@qq.com",  "web app",  "My Apps API License URL");  return apiInfo;  }  
}  

上述的步骤可以解说为:导入swagger-springmvc依赖并在springmvc.xml中配置,编写对应的配置类,就算完成springmvc集成swagger的第一大步了,当然这还远远不够,还需要导入一个很重要的那就是swagger相关的类库(js,css等之类的)

可从github上下载:https://github.com/swagger-api/swagger-ui

本人使用的是2.2.10版本

下载完成后,进行解压,解压后的目录为:

将红色标记处的dist文件夹里面的js,css之类的全部导入webapp目录下

dist目录图为:

index.html中有一处地址需要修改

将此处的url替换为自己本地项目地址,例如http://localhost:8080/blog/api-docs

然后在对应的Controller添加如下注解,此处以我博客系统的UserController作为演示示例:

package com.blog.controller;import java.util.HashMap;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.blog.entity.UserEntity;
import com.blog.service.UserService;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiImplicitParam;
import com.wordnik.swagger.annotations.ApiImplicitParams;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;/*** ** @author youcong* @email ${email}* @date 2018-04-21 15:27:01*/
@Api(value="博客用户管理")
@RestController
@RequestMapping("user")
public class UserController {@Autowired private UserService userService;  @ApiOperation(value = "获得用户列表", notes = "列表信息", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)@PostMapping(value="/getById")public String list(@ApiParam(value = "用户ID", required = true) @RequestParam Integer id) {EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();wrapper.eq("user_id", id);UserEntity userEntity = userService.selectOne(wrapper);return JSON.toJSONString(userEntity);}}

效果图如下:

可在线进行接口测试,对于后台开发者来说,之前没有使用swagger通常使用postMan测试post请求,现在使用了swagger方便管理接口,又可以在线测试。

swagger常用注解:

最常用的5个注解

(1)@Api:修饰整个类,描述Controller的作用

(2)@ApiOperation:描述一个类的一个方法,或者说一个接口

(3)@ApiParam:单个参数描述

@ApiModel::描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候;

@ApiProperty:描述一个model的属性。

其他注解:

  • @ApiImplicitParams:用在方法上包含一组参数说明
  • @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
    • paramType:参数放在哪个地方
      • header-->请求参数的获取:@RequestHeader
      • query-->请求参数的获取:@RequestParam
      • path(用于restful接口)-->请求参数的获取:@PathVariable
      • body(不常用)
      • form(不常用)
    • name:参数名
    • dataType:参数类型
    • required:参数是否必须传
    • value:参数的意思
    • defaultValue:参数的默认值
  • @ApiResponses:用于表示一组响应
  • @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
    • code:数字,例如400
    • message:信息,例如"请求参数没填好"
    • response:抛出异常的类

更详细的可参考此网址:https://github.com/swagger-api/swagger-core/wiki/Annotations#apimodel

许多注解多用用自然知道,熟能生巧。

相关文章:

Task04:青少年软件编程(Python)等级考试模拟卷(一级)

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 电子学会 软件编程&#xff08;Python&#xff09;一级训练营 试题来源 青少…

Python 解决一行代码分成多行及多行代码放在一行

一行代码分成多行 使用 目的&#xff1a;当某一行代码较长&#xff0c;可以增强程序的可读性 for k in range(N):pi 1/pow(16,k)*(\4/(8*k1) - 2/(8*k4) - \1/(8*k5) - 1/(8*k6)) print("圆周率值是&#xff1a;{}".format(pi))多行代码放在一行 使用分号 目的:可…

Task05:青少年软件编程(Python)等级考试模拟卷(一级)

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 电子学会 软件编程&#xff08;Python&#xff09;一级训练营 试题来源 青少…

控件的实际大小与呈现大小

实际大小&#xff1a; label_Mark.Width 100; label_Mark.Height100; 呈现大小&#xff1a; label_Mark.RenderSize new Size(50, 50);转载于:https://www.cnblogs.com/changbaishan/p/3406004.html

MXNet动手学深度学习笔记:卷积计算

为什么80%的码农都做不了架构师&#xff1f;>>> #coding:utf-8卷积计算import mxnet as mx from mxnet.gluon import nn from mxnet import ndarray as nd# 卷积层 # 输入输出的数据格式是&#xff1a; batch * channel * height * width # 权重格式&#xff1a;ou…

Python求100以内的素数和并输出

#求100以内的素数并输出 def isPrime(num):for i in range(2,num):if num%i 0:return Falsereturn True sum 2#1不是素数&#xff0c;2是素数#对[3,100)内的整数逐一进行判断 for i in range(3,100):if isPrime(i):sum iprint(sum)优化版&#xff1a; from math import sqr…

Android KTV

KTV声音实时回放 http://www.cnblogs.com/mythou/tag/android/ Android上用speex做回音消除 http://blog.csdn.net/fireworkburn/article/details/12781985 Android 平台语音通话及回音消除、噪音消除研究 http://blog.csdn.net/AudioAEC/article/details/12685921 Android 实时…

毛慧昀:决策树实现对鸢尾花数据集的分类

毛慧昀是华北电力大学计算机系大三的学生&#xff0c;LSGO软件技术团队&#xff08;Dreamtech算法组&#xff09;成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;荣获多期优秀队长的称号。 这篇图文是她在每周五晚参加线下组队学习活动时的分享。 希望参与我们线…

golang strings.Fields 使用

2019独角兽企业重金招聘Python工程师标准>>> s : "Hello 世\n界!\tHe\vl\flo!" ss : strings.Fields(s) 输出 ["Hello" "世" "界!" "He" "l" "lo!"] 分割规则是 var asciiSpace [256]uint8…

Python 用户的三次登录机会

描述 给用户三次输入用户名和密码的机会&#xff0c;要求如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬…

Realm_King 之 .NET操作XML完整类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Web; namespace BLL{ public class XmlDoc { /// <summary> /// 创建Xml文件 /// </summary> /…

全网把Map中的hash()分析的最透彻的文章,别无二家。

你知道HashMap中hash方法的具体实现吗&#xff1f;你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗&#xff1f;你知道为什么要这么实现吗&#xff1f;你知道为什么JDK 7和JDK 8中hash方法实现的不同以及区别吗&#xff1f;如果你不能很好的回答这些问题&#x…

电子学会青少年编程等级考试Python一级题目解析03

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 Python一级题目解析 1、题目[2021.06] 绘制如下图形&#xff0c;相关参数及要…

Python 函数知识汇总

1. 函数的理解和定义 ① 是什么 函数是一段具有特定功能、可重用的语句组&#xff0c;是一种功能的抽象。 ② 作用 降低编程难度和代码复用 ③ 怎么用 def <函数名>(<参数(0个或多个)>): <函数体> return <返回值> 说明&#xff1a; -函数定义时&…

Android四大基本组件介绍与生命周期

Android四大基本组件分别是Activity&#xff0c;Service服务,Content Provider内容提供者&#xff0c;BroadcastReceiver广播接收器。 一:了解四大基本组件 Activity : 应用程序中&#xff0c;一个Activity通常就是一个单独的屏幕&#xff0c;它上面可以显示一些控件也可以监听…

【快速入门系列】简述 for...in 和 for...of 区别

引言 在对数组或对象进行遍历时&#xff0c;我们经常会使用到两种方法&#xff1a;for...in 和 for...of&#xff0c;那么这两种方法之间的区别是什么呢&#xff1f;让我们来研究研究。 一、for...in 首先我们看下MDN对for...in方法的解释&#xff1a;for...in | MDN for...in …

【新周报(050)】Datawhale组队学习

记录&#xff1a; 按照Datawhale第33期组队学习的规划&#xff0c;六门课程 《吃瓜教程——西瓜书南瓜书》、《动手学数据分析》、《李宏毅机器学习&#xff08;含深度学习&#xff09;》、《数据可视化&#xff08;Matplotlib&#xff09;》、《LeetCode刷题》、《Scratch&am…

PyInstaller库的使用

1.简介 是第三方库&#xff0c;需要额外安装 使用其可以让Python以可执行文件而非源码形式运行 2.安装方式 在命令行输入 pip install pyinstaller 3.使用方式 在命令行输入 pyinstaller -F <文件名.py> 看到多出三个文件夹&#xff0c;其中_pycache_和build可以安全…

myeclipse 遇到的一些问题及解决方案

1.、提示键配置一般默认情况下&#xff0c;Eclipse &#xff0c;MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的&#xff0c;主要是Eclipse &#xff0c;MyEclipse本身有很多选项是默认关闭的&#xff0c;要开发者自己去手动配置。如果开发者不清楚的话&#…

电子学会青少年编程等级考试案例:曲奇饼干

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 案例&#xff1a;曲奇饼干 代码 import turtlet turtle.Pen()t.speed(6) t.p…

linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结

2)对于.gz结尾的文件 gzip -d all.gz gunzip all.gz转载于:https://blog.51cto.com/13203181/2115527

Python组合数据类型之集合类型

单元概述 主要解决问题&#xff1a;让程序更好地处理一组数据 三类重要组合数据类型&#xff1a;集合类型、序列类型和字典类型 学完本章&#xff0c;我们能够在头脑中建立集合、序列和字典的模式来表达对一组数据的表达和处理 1. 定义 集合是多个元素的无序组合 集合中的元…

MVC系列1-MVC基础

终于决定写一个系列的文章了&#xff0c;最开始其实是准备写一下WPF的&#xff0c;因为我这两年一直在做WPF&#xff0c;对WPF的喜爱自然是无以言表。但是由于我所在的地区对WPF的普及不是很广泛&#xff0c;所以&#xff0c;被迫又开始做起来web&#xff0c;但是我又不想在传统…

洛谷 P1816 忠诚

题目描述 老管家是一个聪明能干的人。他为财主工作了整整10年&#xff0c;财主为了让自已账目更加清楚。要求管家每天记k次账&#xff0c;由于管家聪明能干&#xff0c;因而管家总是让财主十分满意。但是由于一些人的挑拨&#xff0c;财主还是对管家产生了怀疑。于是他决定用一…

电子学会青少年编程等级考试Python案例08

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 案例&#xff1a;绘制兔子时钟 代码 import turtlet turtle.Pen()# 表盘 t.p…

Python组合数据类型之序列类型

单元概述 主要解决问题&#xff1a;让程序更好地处理一组数据 三类重要组合数据类型&#xff1a;集合类型、序列类型和字典类型 学完本章&#xff0c;我们能够在头脑中建立集合、序列和字典的模式来表达对一组数据的表达和处理 1. 定义 序列是具有先后关系的一组元素 -序列是…

hdu-3071 Gcd Lcm game---质因数分解+状态压缩+线段树

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid3071 题目大意&#xff1a; 给定一个长度为n的序列m次操作&#xff0c;操作的种类一共有三种 查询 L :查询一个区间的所有的数的最小公倍数modpG :查询一个区间的所有的数的最大公约数modp修改 C :将给定位置…

一个比较保守的404页面

<HTML><HEAD><TITLE>您访问的页面不存在 请转到首页进入</TITLE> <META http-equivContent-Type content"text/html; charsetGB2312"> <META http-equivrefresh content"5;URL /"> <STYLE typetext/css></S…

【组队学习】【34期】组队学习内容详情

第34期 Datawhale 组队学习活动马上就要开始啦&#xff01; 02月09日&#xff08;星期三&#xff09;&#xff0c;宣发&#xff0c;2月组队学习计划&#xff01;。02月12日&#xff08;星期六&#xff09;&#xff0c;进入学习群、开营仪式。 本次组队学习的内容为&#xff1a…

Python组合数据类型之字典类型

单元概述 主要解决问题&#xff1a;让程序更好地处理一组数据 三类重要组合数据类型&#xff1a;集合类型、序列类型和字典类型 学完本章&#xff0c;我们能够在头脑中建立集合、序列和字典的模式来表达对一组数据的表达和处理 1. 定义 首先理解“映射”的概念 -映射是一种键…