当前位置: 首页 > news >正文

.Net6 Api Swagger配置

1、定义个Swagger版本(组)的枚举

namespace WebApp.Enums
{/// <summary>/// api版本枚举/// </summary>public enum ApiVersion{/// <summary>/// v1版本/// </summary>v1 = 1,/// <summary>/// v2版本/// </summary>v2 = 2,}
}

2、添加IServiceCollection 扩展类,配置SwaggerDoc

using Microsoft.OpenApi.Models;
using WebApp.Enums;namespace WebApp.Common.Swagger
{/// <summary>/// SwaggerDoc配置/// </summary>public static class SwaggerExtension{/// <summary>/// Swagger启动服务/// </summary>/// <param name="services">容器</param>/// <param name="apiAssemblyName">项目名称:可以通过Assembly.GetExecutingAssembly().GetName().Name获取</param>/// <param name="apiTitle">api的标题</param>/// <param name="description">api的描述</param>public static void AddSwaggerSetup(this IServiceCollection services, string? apiAssemblyName, string apiTitle, string description){if (services == null) throw new ArgumentNullException(nameof(services));#region 添加Swaggerservices.AddSwaggerGen(options =>{//options.SwaggerDoc("v1", new OpenApiInfo { Title = "售楼API", Version = "v1" });typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{options.SwaggerDoc(version, new OpenApiInfo(){Version = version,Title = $"{apiTitle}",Description = $"{description} {version}",//Contact = new OpenApiContact//{//    Name = "潇湘夜雨",//    Email ="123@qq.com"//}});});// 获取当前项目的 XML文档文件路径:比如我的项目名称叫WebApp,那么它默认的 XML文档文件路径就是当前项目下的 WebApp.xmlvar xmlFile = $"{apiAssemblyName}.xml";var xmlFileFullPath = Path.Combine(AppContext.BaseDirectory, xmlFile);//var domainXmlPath = Path.Combine(AppContext.BaseDirectory, "Bgy.Domain.xml");      // 获取Bgy.Domain.xml文件路径//var viewmodelXmlPath = Path.Combine(AppContext.BaseDirectory, "Bgy.ViewModel.xml");// 获取Bgy.ViewModel.xml文件路径options.IncludeXmlComments(xmlFileFullPath, true); // 添加控制器层注释,true表示显示控制器注释//options.IncludeXmlComments(domainXmlPath);       // 添加Domain层注释//options.IncludeXmlComments(viewmodelXmlPath);    // 添加ViewModel层注释//添加一个必须的全局安全信息,//第一个参数是方案唯一名称:和AddSecurityDefinition方法指定的方案名称标识一致即可:BearerAuth//第二个参数是方案的描述:可以是BasicAuthScheme、ApiKeyScheme的实例或OAuth2Schemeoptions.AddSecurityDefinition("BearerAuth", new OpenApiSecurityScheme(){Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",Name = "Authorization",In = ParameterLocation.Header, //配置jwt默认加在Authorization信息的位置:这里配置的是将jwt信息放在请求头Header中            Type = SecuritySchemeType.Http,//使用Authorize头部                  Scheme = "bearer", //内容为以 bearer开头BearerFormat = "JWT",//Reference= new OpenApiReference() { Type = ReferenceType.SecurityScheme, Id = "bearerAuth" }});//注册全局认证(所有的接口都可以使用认证)options.AddSecurityRequirement(new OpenApiSecurityRequirement(){{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "BearerAuth" //方案名称标识}},new string[] {} //不设权限}});});#endregion}}
}

3、appsettings.json配置文件

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","Swagger": {"environmentVariables": "development" //:development  :testing  :production}
}

4、在Program.cs中注册SwaggerDoc及启用SwaggerUI

using System.Reflection;
using WebApp.Common.Swagger;
using WebApp.Enums;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();//并注册Swagger服务并配置文档信息。
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerSetup(Assembly.GetExecutingAssembly().GetName().Name, "凤凰网", "凤凰网系统接口服务  版本:");var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();//app.UseSwaggerUI();
}
var enviroment = app.Configuration["Swagger:environmentVariables"];
switch (enviroment)
{case "development":app.UseSwagger();//启用Swagger中间件//配置版本app.UseSwaggerUI(options =>{typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{options.SwaggerEndpoint($"/swagger/{version}/swagger.json", version);});});break;case "testing":app.UseSwagger();app.UseSwaggerUI(options =>{typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{options.SwaggerEndpoint($"/swagger/{version}/swagger.json", version);});});break;case "production":break;}app.UseAuthorization();app.MapControllers();app.Run();

5、Api接口中使用

在接口控制器,或者方法上添加版本(组)标识:[ApiExplorerSettings(GroupName = "v1")]

using Microsoft.AspNetCore.Mvc;
using WebApp.Enums;namespace WebApp.Controllers
{/// <summary>/// 测试接口/// </summary>[ApiController]//[ApiController]能够推断参数的绑定源,就不需要[FromBody][FromForm][FromHeader][FromQuery][FromRoute]....来主动指定接收参数的形式[Route("api/[controller]/[action]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;/// <summary>/// 构造函数/// </summary>/// <param name="logger"></param>public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}/// <summary>/// 查询案列1/// </summary>/// <param name="id">编号</param>/// <returns></returns>[HttpGet("Abc")] //url地址是:api/WeatherForecast/Get/Abc[ApiExplorerSettings(GroupName = "v1")] //可以将版本放到控制器上public IActionResult Get(int id){return Ok(id);//返回值:IActionResult//return NotFound(); 404//return Redirect("/Home/Index");//var content = "Hello, World!";//return Content(content, "text/plain");//var data = new { Name = "John", Age = 30 };//return Json(data);//var filePath = "/path/to/file.pdf";//return File(filePath, "application/pdf", "filename.pdf");//byte[] videoBytes = System.IO.File.ReadAllBytes(containerPath);//return File(videoBytes, "video/mp4");}/// <summary>/// 查询案列2:路由的伪静态/// </summary>/// <param name="name"></param>/// <returns></returns>[HttpGet("Abc/{name}")] //url地址是:api/WeatherForecast/Get/Abc/lily   :lily是name值, 同时name值是必填的,{name}必须要与action的参数名称一致。这就是路由的伪静态形式[ApiExplorerSettings(GroupName = nameof(ApiVersion.v2))]public IActionResult Get(string name){return Ok(name);}/// <summary>/// 标记了[NonAction]特性,则不被视为控制器的操作方法/// </summary>/// <param name="id"></param>/// <returns></returns>[HttpPost(Name = "{id}")][NonAction]public string PostTest(int id){return id.ToString();}}
}

6、项目配置生成XML文件

7、效果图

7、注意点:

如果只是单纯只返回token的时候,记得在控制器右上角的Authorize里  先写Bearer+空格+你的token 

相关文章:

  • 单元测试实战(二)Service 的测试
  • 23.11.19日总结(vue2和vue3的区别,项目中期总结)
  • ARCGIS网络分析
  • C#WPF数据模板应用实例
  • -bash: jps: command not found
  • ESP01S通过心知天气获取天气和时间信息
  • Git 提交竟然还能这么用?
  • 第十七篇-Awesome ChatGPT Prompts-备份-百度翻译
  • RHCSA --- Linux存储管理
  • 设计模式—结构型模式之外观模式(门面模式)
  • JOSEF 同步检查继电器 JT-1 额定电压100V 柜内固定安装,板前接线
  • 【数据结构初阶】单链表SLlist
  • 3 redis实现一个消息中间件
  • “我“摸爬滚打5年,干了测试工程师,现在测试怎么样了...
  • Spark数据倾斜_产生原因及定位处理办法_生产环境
  • ES6 ...操作符
  • Java IO学习笔记一
  • laravel with 查询列表限制条数
  • Odoo domain写法及运用
  • PAT A1120
  • Python_OOP
  • React的组件模式
  • Sass 快速入门教程
  • Shadow DOM 内部构造及如何构建独立组件
  • 后端_ThinkPHP5
  • 回流、重绘及其优化
  • 码农张的Bug人生 - 初来乍到
  • 前端相关框架总和
  • 全栈开发——Linux
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 详解NodeJs流之一
  • 小程序开发之路(一)
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #define,static,const,三种常量的区别
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (09)Hive——CTE 公共表达式
  • (4)(4.6) Triducer
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (理论篇)httpmoudle和httphandler一览
  • (排序详解之 堆排序)
  • (四)Controller接口控制器详解(三)
  • (一)为什么要选择C++
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)linux下的时间函数使用
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET Micro Framework初体验
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .netcore如何运行环境安装到Linux服务器