范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

基于。NetCore开发博客项目StarBlog(26)集成Swagger接口文档

  1  前言
  这是StarBlog系列在2023年的第一篇更新 ~
  在之前的文章里,我们已经完成了部分接口的开发,接下来需要使用 curl、Postman 这类工具对这些接口进行测试,但接口一多,每次测试都要一个个填入地址和对应参数会比较麻烦…
  我们需要一种直观的方式来汇总项目里的所有接口,并且如果能直接在里面调试接口,那就更好了。
  Swagger:诶嘿,说的不就是我吗? 2  Swagger介绍
  来一段官网的介绍Simplify API development for users, teams, and enterprises with the Swagger open source and professional toolset.
  翻译:Swagger 是开源和专业的工具集,可以简化用户、团队和企业的 API 开发。
  一般来说,swagger用起来有两部分,一个是 OpenAPI 一个是 SwaggerUI
  在Swagger官网上,OpenAPI 介绍得天花乱坠 The OpenAPI Specification, formerly known as the Swagger Specification, is the world’s standard for defining RESTful interfaces. The OAS enables developers to design a technology-agnostic API interface that forms the basis of their API development and consumption.
  翻译:OpenAPI 规范,以前称为 Swagger 规范,是定义 RESTful 接口的世界标准。 OAS 使开发人员能够设计一个与技术无关的 API 接口,该接口构成了他们 API 开发和使用的基础。
  简单说 OpenAPI 是个标准,需要每种语言和框架自行实现一个工具,用来把项目里的接口都整合起来,生成 swagger.json 文件
  然后 SwaggerUI 就是个网页,读取这个 swagger.json 就可以把所有接口以及参数显示出来,还可以很方便调试,效果如图。image3  Swashbuckle.AspNetCore
  前面说到每种框架都要自己实现一个工具来生成 swagger.json ,这个 Swashbuckle.AspNetCore 就是 .NetCore 平台的实现,用就完事了。
  项目主页: https://github.com/domaindrivendev/Swashbuckle.AspNetCore
  Tips:如果是创建 WebApi 项目,代码模板里面默认就有 Swagger 了,不用手动添加。
  StarBlog项目一开始是使用MVC模板,所以没有自带Swagger,需要手动添加。
  直接使用nuget添加 Swashbuckle.AspNetCore 这个包就完事了。
  这个包功能很多,内置了 SwaggerUI 这个官方界面,还有一个 ReDoc 的纯静态接口文档网页(这个 ReDoc 只能看接口不能调试)。4  初步使用
  为了保证 Program.cs 代码整洁,我们在 StarBlog.Web/Extensions 里面创建 ConfigureSwagger 类 public static class ConfigureSwagger {
  public static void AddSwagger(this IServiceCollection services) {
  services.AddSwaggerGen(options => {
  options.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "APIs"});
  // 在接口文档上显示 XML 注释
  var filePath = Path.Combine(System.AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml");
  options.IncludeXmlComments(filePath, true);
  });
  }
  public static void UseSwaggerPkg(this IApplicationBuilder app) {
  app.UseSwagger();
  app.UseSwaggerUI(options => {
  options.RoutePrefix = "api-docs/swagger";
  options.SwaggerEndpoint("/swagger/v1/swagger.json", "APIs");
  });
  app.UseReDoc(options => {
  options.RoutePrefix = "api-docs/redoc";
  options.SpecUrl = "/swagger/v1/swagger.json";
  });
  }
  }
  上面代码可以看到有三步AddSwaggerGen - 对应前文说的生成 swagger.jsonUseSwagger - 让浏览器可以访问到 /swagger/v1/swagger.json 这类路径UseSwaggerUI - 提供 SwaggerUI 的网页访问
  然后回到 Program.cs 里面,分别注册服务和添加中间件就好了。 // 注册服务
  builder.Services.AddSwagger();
  // 添加中间件
  app.UseSwaggerPkg();
  现在启动项目,访问 http://[本地地址]/api-docs/swagger 就能看到接口文档了
  效果大概这样image 扩展:关于XML注释
  C# 的代码注释可以导出XML,然后显示在 swagger 文档上
  注意需要手动在 .csproj 项目配置里面开启,才会输出XML文档 
  <PropertyGroup>
  <GenerateDocumentationFile>trueGenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591NoWarn>
  PropertyGroup>
  但是开启XML之后,IDE很蠢的要求我们所有public成员都写上注释,很烦,加上 $(NoWarn);1591 这行就可以关掉这个警告。
  在 Swagger 里加载XML文档,既可以用本文前面写的方式 var filePath = Path.Combine(System.AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml");
  options.IncludeXmlComments(filePath, true);
  还可以用第二种,加载目录里的全部XML var xmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "*.xml");
  foreach (var file in xmlFiles) {
  options.IncludeXmlComments(file, true);
  }
  具体用哪种,都行吧,看心情~ 扩展:关于 AddEndpointsApiExplorer
  在 AddSwagger 扩展方法这里可能有同学会有疑问
  为啥创建 .Net6 项目后默认是这两行代码 builder.Services.AddEndpointsApiExplorer();
  builder.Services.AddSwaggerGen();
  而我这里只有一行代码 services.AddSwaggerGen();
  先说结论:AddEndpointsApiExplorer 是为了支持 Minimal Api 的。
  因为 StarBlog 项目使用的是MVC模板,在 Program.cs 的最开始可以看到这行代码,添加控制器和视图 builder.Services.AddControllersWithViews();
  翻一下这个框架的源码,可以看到这个方法的套娃是这样的 AddControllersWithViews() -> AddControllersWithViewsCore() -> AddControllersCore()
  而在 AddControllersCore 里面,又调用了 AddApiExplorer private static IMvcCoreBuilder AddControllersCore(IServiceCollection services) {
  // This method excludes all of the view-related services by default.
  var builder = services
  .AddMvcCore()
  .AddApiExplorer()
  .AddAuthorization()
  .AddCors()
  .AddDataAnnotations()
  .AddFormatterMappings();
  if (MetadataUpdater.IsSupported) {
  services.TryAddEnumerable(
  ServiceDescriptor.Singleton());
  }
  return builder;
  }
  就是说正常的项目已经有 ApiExplorer 这个东西了,但是 Minimal Api 项目没有,所以本项目不需要 builder.Services.AddEndpointsApiExplorer(); 这行代码。
  详情可以阅读参考资料的第一个链接。5  接口分组
  接口文档有了,但项目里接口太多了,几十个接口全挤在一个页面上,找都找得眼花了
  这时候可以给接口分个组
  先来给 StarBlog 项目里面的接口分个类,根据不同用途,大致分成这五类:admin - 管理员相关接口common - 通用公共接口auth - 授权接口blog - 博客管理接口test - 测试接口
  还是在上面那个 ConfigureSwagger.cs 文件
  修改 AddSwagger 方法,把这几个分组添加进去 services.AddSwaggerGen(options => {
  options.SwaggerDoc("admin", new OpenApiInfo {
  Version = "v1",
  Title = "Admin APIs",
  Description = "管理员相关接口"
  });
  options.SwaggerDoc("common", new OpenApiInfo {
  Version = "v1",
  Title = "Common APIs",
  Description = "通用公共接口"
  });
  options.SwaggerDoc("auth", new OpenApiInfo {
  Version = "v1",
  Title = "Auth APIs",
  Description = "授权接口"
  });
  options.SwaggerDoc("blog", new OpenApiInfo {
  Version = "v1",
  Title = "Blog APIs",
  Description = "博客管理接口"
  });
  options.SwaggerDoc("test", new OpenApiInfo {
  Version = "v1",
  Title = "Test APIs",
  Description = "测试接口"
  });
  });
  这样就会生成五个 swagger.json 文件,路径分别是/swagger/admin/swagger.json/swagger/common/swagger.json/swagger/auth/swagger.json/swagger/blog/swagger.json/swagger/test/swagger.json
  所以下面的 UseSwaggerPkg 方法也要对应修改 public static void UseSwaggerPkg(this IApplicationBuilder app) {
  app.UseSwagger();
  app.UseSwaggerUI(options => {
  options.RoutePrefix = "api-docs/swagger";
  options.SwaggerEndpoint("/swagger/admin/swagger.json", "Admin");
  options.SwaggerEndpoint("/swagger/blog/swagger.json", "Blog");
  options.SwaggerEndpoint("/swagger/auth/swagger.json", "Auth");
  options.SwaggerEndpoint("/swagger/common/swagger.json", "Common");
  options.SwaggerEndpoint("/swagger/test/swagger.json", "Test");
  });
  }
  接下来,要让 Swagger 知道每个接口都是属于哪个分组的。
  具体方法是在 Controller 上添加 ApiExplorerSettings 特性。
  比如 BlogController 是属于 blog 分组,在 class 定义前面添加一行代码 [ApiExplorerSettings(GroupName = "blog")]
  public class BlogController : ControllerBase {
  // ...
  }
  其他的 Controller 也是类似的操作,具体分组跟 StarBlog.Web/Apis 下的目录结构一样,这里就不赘述了。 实现效果
  做完之后,打开 swagger 接口文档页面
  可以看到右上角可以选择接口分组了image
  搞定。6  优化分组
  前文对于 Swagger 分组的实现其实是一种硬编码,不同分组的 Controller 上面需要加上 [ApiExplorerSettings(GroupName = "blog")] 特性,分组名全靠复制粘贴,在项目比较小的情况下还好,如果分组多起来了,有几百个接口的时候,估计人就麻了吧 Q:"你刚才干嘛不早说 "
  A:"循序渐进嘛 "
  A:"StarBlog项目也是最近才换到新版分组的 "
  在 StarBlog.Web/Models 里添加个新的类 SwaggerGroup public class SwaggerGroup {
  /// 
  /// 组名称(同时用于做URL前缀)
  /// 
  public string Name { get; set; }
  public string? Title { get; set; }
  public string? Description { get; set; }
  public SwaggerGroup(string name, string? title = , string? description = ) {
  Name = name;
  Title = title;
  Description = description;
  }
  /// 
  /// 生成 
  /// 
  public OpenApiInfo ToOpenApiInfo(string version = "1.0") {
  var item = new OpenApiInfo();
  Title ??= Name;
  Description ??= Name;
  return new OpenApiInfo { Title = Title, Description = Description, Version = version };
  }
  }
  然后改造一下 StarBlog.Web/Extensions/ConfigureSwagger.cs
  在这个文件里面添加个新的类,这样就不会硬编码了  public static class ApiGroups {
  public const string Admin = "admin";
  public const string Auth = "auth";
  public const string Common = "common";
  public const string Blog = "blog";
  public const string Test = "test";
  }
  在 ConfigureSwagger 里添加一些代码,创建 SwaggerGroup 列表 public static class ConfigureSwagger {
  public static readonly List Groups = new() {
  new SwaggerGroup(ApiGroups.Admin, "Admin APIs", "管理员相关接口"),
  new SwaggerGroup(ApiGroups.Auth, "Auth APIs", "授权接口"),
  new SwaggerGroup(ApiGroups.Common, "Common APIs", "通用公共接口"),
  new SwaggerGroup(ApiGroups.Blog, "Blog APIs", "博客管理接口"),
  new SwaggerGroup(ApiGroups.Test, "Test APIs", "测试接口")
  };
  }
  然后把后面的 AddSwagger 方法改成这样,那一坨东西,现在一行代码就代替了  public static void AddSwagger(this IServiceCollection services) {
  services.AddSwaggerGen(options => {
  Groups.ForEach(group => options.SwaggerDoc(group.Name, group.ToOpenApiInfo()));
  // XML注释
  var filePath = Path.Combine(AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml");
  options.IncludeXmlComments(filePath, true);
  });
  }
  接着是 UseSwaggerPkg 方法,简单  public static void UseSwaggerPkg(this IApplicationBuilder app) {
  app.UseSwagger();
  app.UseSwaggerUI(opt => {
  opt.RoutePrefix = "api-docs/swagger";
  // 分组
  Groups.ForEach(group => opt.SwaggerEndpoint($"/swagger/{group.Name}/swagger.json", group.Name));
  });
  }
  Controller里面也对应修改成这样 [ApiExplorerSettings(GroupName = ApiGroups.Blog)]
  public class BlogController : ControllerBase {
  }
  完美 7  小结
  "Swagger之大,一锅炖不下"
  关于Swagger还有其他的用法,但需要一些前置知识,因此本文不会把StarBlog项目中关于Swagger的部分全部介绍完
  等把相关的前置知识写完,再来完善对应的用法~
  这也跟StarBlog的开发过程是吻合的 8  参考资料 https://stackoverflow.com/questions/71932980/what-is-addendpointsapiexplorer-in-asp-net-core-6 9  系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetCore开发博客项目 StarBlog - (3) 模型设计 基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流 基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能 基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化) 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片  基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化 基于.NetCore开发博客项目 StarBlog - (21) 开始开发RESTFul接口 基于.NetCore开发博客项目 StarBlog - (22) 开发博客文章相关接口 基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序 基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式 基于.NetCore开发博客项目 StarBlog - (25) 图片接口与文件上传  基于.NetCore开发博客项目 StarBlog - (26) 集成Swagger接口文档

新进展!小米总裁称造车团队超1200人,据爆首款车对标Model3?日前,小米总裁王翔在接受采访时公布了小米造车的新进展。王翔说道,小米正持续投入资源进行核心技术研发,目前仍保持原定交付计划不变,正在全力以赴按计划进行。据其介绍,截至目前,小米公司苹果iPhone14Pro渲染图曝光打孔药丸设计,还有紫色版本IT之家5月26日消息,今日,爆料人JonProsser曝光了iPhone14Pro渲染图。相关渲染图由苹果概念平面设计师IanZelbo制作,展示了传闻中今年高端iPhone机型存取养老金,银行有什么规定?提醒注意5个方面的细节存取养老金,银行有什么规定?提醒老人及子女注意5个方面的细节。社保卡的一个重要功能就是金融功能,金融功能激活后,退休人员每月的养老金就发放到了社保卡。社保卡的金融功能实际上就是一个网传黄晓明有新欢?多处细节被扒,女方离婚带2娃,回应来了黄晓明和杨颖,原本是非常幸福的一对明星情侣。当初杨颖结婚时,黄晓明给了杨颖一个全世界的女生都羡慕的世纪婚礼,还利用身边的一切资源捧红杨颖。即便如此,两人的婚姻还是走向了终结。两人离华为p50pro骁龙版不玩游戏的话,这个手机真没什么缺点从iphone4开始一直到iPhone13,基本都用的是苹果手机,今年跨入华为大军。入手了华为P50Pro。买之前也做了功课,都说麒麟版的不错,一直想买p50pro麒麟版,结果全面618中端游戏手机,我选青年良品OPPOK10高考即将来临,618的购物季买新手机肯定是各路准大学生们第一要务这两年由于高通骁龙旗舰处理器的发热和功耗拉胯,真正懂行甚至亲自体验过各种处理器的达人一般都会向身边人推荐性热比出众的新女友酷似杨颖,肤白貌美大长腿,3个细节看出黄晓明酷爱养成系新女友像baby?黄晓明生活中也是霸总,温顺乖巧是他的风向标引言。黄晓明自从和baby离婚后,绯闻女友多是网红,这一次,一位叫叶珂的网红被扒,疑似是黄晓明的新女友。虽然5月25日,TakeTwo以127亿美元完成收购Zynga,游戏史上完成的最大交易IT之家5月23日消息,TakeTwo宣布已完成游戏行业历史上最大的收购之一,以127亿美元完成收购Zynga。在微软687亿美元收购动视暴雪之前,该交易是游戏史上的最大一笔交易。博物馆发力转型,文博游趋向既鲜又活本文约2910字预计阅读时长4分钟在过去不久的国际博物馆日(5月18日)中,我国多地博物馆通过线上线下结合的方式,为广大游客奉献了内容丰富形式多样的展览和活动,文博游的热度再次提升小白秒变摄影高手,三星GalaxyS22系列手机搭载AI影像黑科技随着科技的发展和工业水平的提高,让当下的智能手机有着不一样的发展态势。如何才能拥有一款让消费者满意的手机呢?这就需要手机厂商不断加强技术创新,努力打造品牌的差异竞争优势,才能赢得更雷军亮剑,红米K50系列降600元,5500mAh大电池120W快充很香618的大战已经拉开,现在各大手机品牌已经纷纷降价,就连很多主流的顶级旗舰也把价格调低了不少。作为每年都要在618中崭露头角的红米来说,今年已经做好了准备,最近这个子品牌又上线了R
45岁男子,酒后心梗去世,提醒酒后不要做四件事,加大心梗风险很多人都喜欢喝酒,但是酒后,你会怎么做呢?不同的人有不同的见解,有的人认为,喝了酒,醉醺醺的,看世界都是转的,当然只能好好休息,过一夜,酒醒了就好了。也有人说,喝多了酒,一定不能睡2022年上海市社保基数标准(缴费基数一览表)随着2021年度工资性收入申报工作的结束,上海公布最新社保基数调整结果(自助经办系统里已更新),2022年7月开始上海社保最低基数由原来的5975调整为6520。上海社保系统数据已41!日本队大获全胜,早田希娜勇夺女单冠军,国乒14人无缘四强2022年9月18日,乒乓球WTT哈萨克斯坦赛迎来收官日,国乒成为看客,没有队员打进四个项目的决赛,率先结束的女单决赛,日本名将早田希娜41战胜葡萄牙选手付玉,夺得女单冠军,拿到4阿根廷国家队历史射手榜梅西稳居首位,现役三人进前十直播吧9月19日讯阿根廷国家队最新一期的大名单当中,梅西迪马利亚劳塔罗马丁内斯全部入选,在阿根廷队历史射手榜前十名当中,只有这三人是现役国脚(伊瓜因已退出国家队)。其中梅西以86球国家发改委答澎湃跨区通道按最大能力支援四川能源保供9月19日,在国家发展改革委召开的9月份新闻发布会上,澎湃新闻(www。thepaper。cn)记者提问今年夏季,四川持续高温干旱天气对电力保供形成挑战,请问国家发改委如何应对这一区委书记访谈始终坚持制造业强区记者今年是闵行区撤二建一设立30周年。长期以来,闵行综合经济实力一直在全市各区中稳居第二,靠什么形成比较优势?陈宇剑闵行有着自身先天优势和郊区比,有区位优势和中心倪萍一句话,戳破亿万人的隐痛那个最爱你的人,其实在说谎来源李月亮(IDbymooneye)看到一条新闻,心里很难过。四川达州,一位进城的老人错过了末班车,凌晨独自坐在街头。一个好心的出租车司机路过,把他送回了家。事情挺暖心的,但老人的失眠之苦甚于挨饿对于很多人来说,睡眠是一件再自然不过的事情。饿了吃困了睡似乎是一件天经地义的事情。当有人伸着懒腰从梦中醒来,抱怨做了一宿的梦睡得真累的时候,那些彻夜不眠的失眠者正在痛苦地煎熬着,无今蝉护肤喜欢熬夜的你,肌肤还好吗?熬夜对我们的肌肤伤害非常大,长时间的睡眠都不足,使肤色变得暗沉长痘痘,人也会看起来精神不振,气色不佳,有什么方法可拯救憔悴熬夜肌呢?NO。01熬夜对肌肤的危害眼袋黑眼圈熬夜造成人体越南理发店,为何受中国人喜欢?看完我都想去了在现实的生活中,很多人面对理发觉得有那么一点点不可思议。如果你选择出国旅游观光的话,要是在国外想要理发将会做什么呢?(此处已添加小程序,请到今日头条客户端查看)比如今天给大家介绍的看了无数遍塞尔达2的新预告,玩家们解决了哪些谜题?距离上次公布荒野大镖客续集的跳票已经过去近半年了。在最新的任天堂面对面会上,我们终于等到了这款作品的最新预告。同时官方发布了这部作品的全称塞尔达传说王国之泪。虽然这次发布的视频并不