保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

SpringBoot2。X集成Swagger2开发API文档

  前言
  相信很多后端开发在项目中都会碰到要写api文档,不管是给前端、移动端等提供更好的对接,还是以后为了以后交接方便,都会要求写api文档。
  而手写api文档的话有诸多痛点:文档更新的时候,需要再次发送给对接人接口太多,手写文档很难管理接口返回的结果不明确不能直接在线测试接口,通常需要使用工具,如postman等
  Swagger就很好地解决了这个问题。Swagger简介
  Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger使用1。相关依赖!swagger2dependencygroupIdio。springfoxgroupIdspringfoxswagger2artifactIdversion2。9。2versiondependencydependencygroupIdio。springfoxgroupIdspringfoxswaggeruiartifactIdversion2。9。2versiondependency2。Swagger配置类ConfigurationEnableSwagger2publicclassSwaggerConfig{BeanpublicDocketbuildDocket(){returnnewDocket(DocumentationType。SWAGGER2)。apiInfo(buildApiInf())将api的元信息设置为包含在jsonresourcelisting响应中。host(127。0。0。1:8080)设置ip和端口,或者域名。select()启动用于api选择的生成器。apis(RequestHandlerSelectors。any())。apis(RequestHandlerSelectors。basePackage(cn。zwqh。springboot。controller))指定controller路径。paths(PathSelectors。any())。build();}privateApiInfobuildApiInf(){ContactcontactnewContact(朝雾轻寒,https:www。zwqh。top,zwqhclover1314。com);returnnewApiInfoBuilder()。title(SwaggerDemoRestfulAPIDocs)文档标题。description(Swagger示例RestfulApi文档)文档描述。contact(contact)联系人。version(1。0)版本号。license()更新此API的许可证信息。licenseUrl()更新此API的许可证Url。termsOfServiceUrl()更新服务条款URL。build();}}3。SpringMVC相关配置ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurationSupport{静态资源配置(默认)OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry。addResourceHandler()。addResourceLocations(classpath:static);静态资源路径registry。addResourceHandler(swaggerui。html)。addResourceLocations(classpath:METAINFresources);registry。addResourceHandler(webjars)。addResourceLocations(classpath:METAINFresourceswebjars);super。addResourceHandlers(registry);}}
  如果不添加此静态资源配置会报错,找不到相关路径4。Model中使用Swagger注解ApiModel(valueUserEntity,description用户对象)publicclassUserEntityimplementsSerializable{privatestaticfinallongserialVersionUID5237730257103305078L;ApiModelProperty(value用户id,nameid,dataTypeLong,requiredfalse,example1,hiddenfalse)privateLongid;ApiModelProperty(value用户名,nameuserName,dataTypeString,requiredfalse,example关羽)privateStringuserName;ApiModelProperty(value用户性别,nameuserSex,dataTypeString,requiredfalse,example男)privateStringuserSex;publicLonggetId(){returnid;}publicvoidsetId(Longid){this。idid;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this。userNameuserName;}publicStringgetUserSex(){returnuserSex;}publicvoidsetUserSex(StringuserSex){this。userSexuserSex;}}5。Controller中使用Swagger注解RestControllerRequestMapping(api)Api(tags{接口分组1,接口分组2})publicclassApiController{AutowiredprivateUserDaouserDao;GetMapping(getAllUser)ApiOperation(value获取所有用户,notes,httpMethodGET,tags接口分组3)publicListUserEntitygetAll(){returnuserDao。getAll();}GetMapping(getUserById)ApiOperation(value根据id获取用户,notesid必传,httpMethodGET)ApiImplicitParam(nameid,value用户id,example1,requiredtrue,dataTypelong,paramTypequery)publicUserEntitygetOne(Longid){returnuserDao。getOne(id);}PostMapping(getUserByNameAndSex)ApiOperation(value根据name和sex获取用户,notes,httpMethodPOST)ApiImplicitParams({ApiImplicitParam(nameuserName,value用户名,example关羽,requiredtrue,dataTypestring,paramTypequery),ApiImplicitParam(nameuserSex,value用户性别,example男,requiredtrue,dataTypestring,paramTypequery)})publicUserEntitygetUserByNameAndSex(StringuserName,StringuserSex){returnuserDao。getUserByNameAndSex(userName,userSex);}PostMapping(insertUser)ApiOperation(value新增用户,notes传json,数据放body,httpMethodPOST)ApiImplicitParams({ApiImplicitParam(namebody,value用户对象json,example{userName:朝雾轻寒,userSex:男},requiredtrue)})publicStringinsertUser(RequestBodyStringbody){System。out。println(body);UserEntityuserJSON。parseObject(body,UserEntity。class);userDao。insertUser(user);return{code:0,msg:success};}PostMapping(updateUser)ApiOperation(value修改用户,notes传json,数据放body,httpMethodPOST)ApiImplicitParams({ApiImplicitParam(namebody,value用户对象json,example{id:23,userName:朝雾轻寒,userSex:女},requiredtrue)})publicStringupdateUser(RequestBodyStringbody){System。out。println(body);UserEntityuserJSON。parseObject(body,UserEntity。class);userDao。updateUser(user);return{code:0,msg:success};}PostMapping(deleteUser)ApiOperation(value删除用户,notesid必传,httpMethodPOST)publicStringdeleteUser(ApiParam(nameid,value用户id,requiredtrue)Longid){userDao。deleteUser(id);return{code:0,msg:success};}}5。测试
  访问http:127。0。0。1:8080swaggerui。html进行接口在线测试Swagger常用注解1。Api
  用于类,表示表示这个类是swagger的资源。属性如下:tags表示说明,tags如果有多个值,会生成多个列表value表示说明,可以使用tags替代2。ApiOperation
  用于方法,表示一个http请求的操作。属性如下:value用于方法描述notes用于提示内容tags用于API文档控制的标记列表,视情况而用,可以进行独立分组3。ApiParam
  用于方法、参数、字段说明;表示对参数的添加元数据。name参数名value参数说明required是否必填4。ApiModel
  用于类,表示对类进行说明,用于参数用实体类接受。value对象名description描述5。ApiModelProperty
  用于方法、字段,表示对model属性的说明或者数据操作更改。value字段说明name重写属性名dataType重写属性数据类型required是否必填example举例说明hidden隐藏6。ApiIgnore
  用于类、方法、方法参数,表示这个方法或者类被忽略,不在swaggerui。html上显示。7。ApiImplicitParam
  用于方法,表示单独的请求参数。name参数名value参数说明dataType数据类型paramType参数类型example举例说明8。ApiImplicitParams
  用于方法,包含多个ApiImplicitParam。9。ApiResponsesApiResponse
  用于类或者方法,描述操作的可能响应。code响应的HTTP状态代码message响应附带的可读消息10。ResponseHeader
  用于方法,响应头设置。name响应头名称description头描述response默认响应类voidresponseContainer参考ApiOperation中配置Swagger导出离线api文档1。导出AsciiDocs、Markdown、Confluence格式文档
  添加依赖!swagger2markup相关依赖dependencygroupIdio。github。swagger2markupgroupIdswagger2markupartifactIdversion1。3。3versiondependency
  转换工具类publicclassSwaggerUtils{privatestaticfinalStringurlhttp:127。0。0。1:8080v2apidocs;生成AsciiDocs格式文档throwsMalformedURLExceptionpublicstaticvoidgenerateAsciiDocs()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。ASCIIDOC)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFolder(Paths。get(。docsasciidocgenerated));}生成AsciiDocs格式文档,并汇总成一个文件throwsMalformedURLExceptionpublicstaticvoidgenerateAsciiDocsToFile()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。ASCIIDOC)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFile(Paths。get(。docsasciidocgeneratedall));}生成Markdown格式文档throwsMalformedURLExceptionpublicstaticvoidgenerateMarkdownDocs()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。MARKDOWN)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFolder(Paths。get(。docsmarkdowngenerated));}生成Markdown格式文档,并汇总成一个文件throwsMalformedURLExceptionpublicstaticvoidgenerateMarkdownDocsToFile()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。MARKDOWN)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFile(Paths。get(。docsmarkdowngeneratedall));}生成Confluence格式文档throwsMalformedURLExceptionpublicstaticvoidgenerateConfluenceDocs()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。CONFLUENCEMARKUP)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFolder(Paths。get(。docsconfluencegenerated));}生成Confluence格式文档,并汇总成一个文件throwsMalformedURLExceptionpublicstaticvoidgenerateConfluenceDocsToFile()throwsMalformedURLException{Swagger2MarkupConfigconfignewSwagger2MarkupConfigBuilder()。withMarkupLanguage(MarkupLanguage。CONFLUENCEMARKUP)。withOutputLanguage(Language。ZH)。withPathsGroupedBy(GroupBy。TAGS)。withGeneratedExamples()。withoutInlineSchema()。build();Swagger2MarkupConverter。from(newURL(url))。withConfig(config)。build()。toFile(Paths。get(。docsconfluencegeneratedall));}}
  使用测试ControllerRestControllerRequestMapping(export)ApiIgnorepublicclassExportController{RequestMapping(ascii)publicStringexportAscii()throwsMalformedURLException{SwaggerUtils。generateAsciiDocs();returnsuccess;}RequestMapping(asciiToFile)publicStringasciiToFile()throwsMalformedURLException{SwaggerUtils。generateAsciiDocsToFile();returnsuccess;}RequestMapping(markdown)publicStringexportMarkdown()throwsMalformedURLException{SwaggerUtils。generateMarkdownDocs();returnsuccess;}RequestMapping(markdownToFile)publicStringexportMarkdownToFile()throwsMalformedURLException{SwaggerUtils。generateMarkdownDocsToFile();returnsuccess;}RequestMapping(confluence)publicStringconfluence()throwsMalformedURLException{SwaggerUtils。generateConfluenceDocs();returnsuccess;}RequestMapping(confluenceToFile)publicStringconfluenceToFile()throwsMalformedURLException{SwaggerUtils。generateConfluenceDocsToFile();returnsuccess;}}2。导出html、pdf、xml格式
  添加依赖!离线文档dependencygroupIdorg。springframework。restdocsgroupIdspringrestdocsmockmvcartifactIdscopetestscopedependency!springfoxstaticdocs生成静态文档dependencygroupIdio。springfoxgroupIdspringfoxstaticdocsartifactIdversion2。6。1versiondependencybuildpluginManagementpluginsplugingroupIdorg。springframework。bootgroupIdspringbootmavenpluginartifactIdpluginplugingroupIdio。github。swagger2markupgroupIdswagger2markupmavenpluginartifactIdversion1。3。1versionconfigurationswaggerInputhttp:127。0。0。1:8080v2apidocsswaggerInputoutputDir。docsasciidocgeneratedoutputDirconfigswagger2markup。markupLanguageASCIIDOCswagger2markup。markupLanguageconfigconfigurationpluginplugingroupIdorg。asciidoctorgroupIdasciidoctormavenpluginartifactIdversion1。5。3version!version2。0。0RC。1version!IncludeAsciidoctorPDFforpdfgenerationdependenciesdependencygroupIdorg。asciidoctorgroupIdasciidoctorjpdfartifactIdversion1。5。0alpha。10。1versiondependencydependencygroupIdorg。jrubygroupIdjrubycompleteartifactIdversion1。7。21versiondependencydependenciesconfigurationsourceDirectory。docsasciidocgeneratedsourceDirectoryoutputDirectory。docsasciidochtmloutputDirectorybackendhtmlbackend!outputDirectory。docsasciidocpdfoutputDirectorybackendpdfbackendheaderFootertrueheaderFooterdoctypebookdoctypesourceHighlightercoderaysourceHighlighter!菜单栏在左边toclefttoc!多标题排列toclevels3toclevels!自动打数字序号sectnumstruesectnumsattributesconfigurationpluginpluginspluginManagementbuild
  可以修改此处html和pdf,通过mvnasciidoctor:processasciidoc可以导出相应格式文件outputDirectory。docsasciidochtmloutputDirectorybackendhtmlbackend
  执行mvnasciidoctor:processasciidoc后再执行mvngenerateresources,可在targtgenerateddocs目录下生成xml格式文件

满分作文箭锋上的友情周瑜在军营帐篷里来回踱着步,一只飞蛾在案台上的火烛旁飞来飞去。帐篷里忽暗忽明,帐篷门口站岗的士兵叹了口气,他明白帐篷里的人一定正被着什么事所烦恼着,但同时他也明白像他这样的小人……阿里财报阿里确实焦虑了2021年,对于阿里来说是艰难的一年。营收增长放缓,净利润增速腰斩,基本盘淘系电商增速跌至个位数,而本地生活、国际业务、云计算、数字媒体业务不仅挑不起大梁,反而拖累了整体盈利能……血糖仪多少钱一台?什么价位的血糖仪好?买个进口的选什么价位我觉得应该血糖仪测试准不准,再高的价位血糖仪不准也没啥意思。我2021年7月份查血糖高,朋友推荐买了一台罗氏卓越金采血糖仪,测量值还是比较准确的,这是……众安保险联合阿里健康推出癫痫保医疗险黄一灵中国证券报中证网中证网讯(记者黄一灵)近日,众安保险联合阿里健康推出为癫痫人群定制的医疗险癫痫保,为癫痫患者提供一体化的健康管理和保障服务。在我国,癫痫已成为……家乡的田野作文八篇导语:我们向往着那美丽的长城,我们向往着那奔流不息的长江,但我们更爱家乡的田野。我们家乡的田野景色美丽无比。以下是小编为大家分享的家乡的田野作文八篇,欢迎借鉴!篇一:家乡……拒绝盲从作文300字真要命,我上星期刚买的鞋就被别人一句话否定了:这种鞋现在不流行了。流行,流行!你是何方妖魔,竟把我半天挑来的皮鞋全盘否定了。难道我应盲目跟风?或者是否定盲从?难道传播很广……我的小仓鼠作文550字兔子小Q走后,我们家有来了两位新客人,两只仓鼠。两只仓鼠做为我们家的新客人,有很多可笑的事情,就让我给你介绍一下吧。NO1两只吃货以前我曾经养过四只仓鼠,两只兔子和……超好用的Vue图片懒加载库VueLazyload前沿应用开发中图片的加载是比较耗资源的,处理不好,就会影响应用的加载速度,导致用户体验比较差劲今天给大家介绍一个Vue的图片懒加载库VueLazyload,这个库的……给同学的一封信600字范文书信在人类的交流与沟通的历史上占有重要地位。下面是给同学的一封信600字,也许对你有帮助哦。给同学的一封信600字范文一:亲爱的同学们:你们好!聚也匆匆,散也……读你窗外的深秋,绿叶变黄,花儿凋谢,小草枯黄的身板累得直不起要来,死死地趴在地上。虫儿不叫,鸟儿不鸣。在这天底下的我们默默的想着对方:你好吗?不知道为什么,你我之间好像……关于春天的日记春天来了冬爷爷刚撒完无味的ldquo;白糖。rdquo;春姑娘迈着轻盈地脚步来了。春姑娘来到草坪,小草绿了,不停地向春姑娘问好。春姑娘来到小河,小河唱起了快乐……我爱立夏作文500字今天是立夏,我国传统的农历二十四节气中的第七个节气,夏季的第一个节气。立夏时节,万物繁茂,是各类作物耕种的重要季节。我一直期盼着立夏到来,因为今天我们班级要举行激动人心的拼蛋活……
老外离开中国后最想念啥?美食手机支付只能排第二离开中国后,你最想念的是什么?有人就这个问题采访了许多位在中国生活过的外国人。是色香味俱全、享誉海内外的中国美食吗?还是我们引以为傲的新四大发明高铁、扫码支付、共享单车和……独家!刚刚,微软将HELLO转译成DNA,并成功进行读取引述MITTechnologyReview(《麻省理工科技评论》)的消息,3月22日,微软与华盛顿大学旗下公司的研究人员,成功通过自动化设备将数字信息存储为DNA,并进行读取。……黄山在安徽,有一座美丽的山,它高耸入云、绿树葱笼、风景如画,是人间天堂、世外桃源,它就是被联合国列为世界文化自然遗产的黄山。进入黄山景区,就像进入了一幅画里一样。百年古树数不……德州仪器一个大厂才敢使用的CPU德州仪器不做CPU已经很长时间了,在高通麒麟三星在安卓阵营厮杀中,德州仪器处理器已经被用户忘记了!德州仪器不做CPU的理由很简单,没有基带。做手机处理器不赚钱,无利可图。……女孩子都后悔了两天前被吐槽智商检测机,手机将迎来倒闭!前几天笔者盘点了一款2019年智商检测机,该机就是美图今年最新旗舰手机美图V7(MP1801),虽然美图很意外的用上了高通骁龙845,但是手机售价方面甚至比市面上普遍的高通骁龙……树的自述树的自述大家好,我是一棵树,最近我真够惨的,我身旁有一条又脏又臭的小河,难闻死了,都怪人类没有好好的保护环境。最近总是有记个孩子到这里来玩,别的地方不去,偏要到这里来,一想就知……小学生优秀作文我们去踏青今天是清明节,我和妈妈还有妈妈的朋友和她的女儿一起去踏青,在车上的收音机里我们听到了清明的那首歌:清明时节雨纷纷,路上行人欲断魂。借问酒家何处有,牧童遥指杏花村。还听到了关于清……苹果官网疯狂暗示iPhoneSE2或3月25日亮相iPhoneSE2的相关传闻已经看了一年多,现在终于有准信了,这次的爆料者,是苹果自己。距离3月25日苹果春季发布会越来越近,苹果官网这几天也每日上架12款新品。有网友发……小学生作文500字亲情亲情大年三十这一天,我们一家三口带着给爷爷奶奶买的新年礼物,来到宇轩花园奶奶家过年。奶奶家是一个大家庭,在这里过年十分热闹。晚餐开始了!一家人围坐在一起,其乐融融,……小孩儿玩的东西都要嵌入式了?ArmLinuxArduino板据外媒报道,去年在Kickstarter众筹了近30万美元制造了一台复古游戏机,并于去年夏天开始陆续向支持者发货。收到货物的作者进行了开箱和测评。ClockworkPiG……大湾区信息通信业重大利好!光纤网络首次实现粤港澳互通3月22日上午,在粤港澳大湾区信息通信服务合作发布会上,南方记者了解到,中国联通,香港电讯、澳门电讯三者合作,构建粤港澳大湾区精品网,率先实现粤港澳光纤固网互联互通。中国……数据被曝!诺基亚手机向中国发送用户信息3月22日,据外媒Phonearena报道,NRK(挪威广播公司)指出,有部分诺基亚智能手机一直在向中国发送未加密的用户信息。对此,HMD公司正在接受芬兰数据保护监管机构的调查……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网