Swagger入门

Posted lostsea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swagger入门相关的知识,希望对你有一定的参考价值。

对于新手来说,Swagger入门是十分容易的

1.首先添加nuget包,Swashbuckle.AspNetCore这一个就可以了

 技术图片

 2.添加SwaggerConfig文件

 /// <summary>
    /// SwaggerConfig
    /// </summary>
    public class SwaggerConfig
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="services"></param>
        public static void Register(IServiceCollection services)
        {
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApi", Version = "v1" });
                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                c.IncludeXmlComments(Path.Combine(basePath, "Models.xml"));
                c.IncludeXmlComments(Path.Combine(basePath, "WebApi.xml"));
                c.DocumentFilter<DocF>();

                #region JwT Beare认证
                c.AddSecurityDefinition("WebApi", new OpenApiSecurityScheme()
                {
                    Description = "请输入Token",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                    {
                        new OpenApiSecurityScheme {
                            Reference = new OpenApiReference()
                            {
                                Id = "WebApi",
                                Type = ReferenceType.SecurityScheme
                            }
                        }, Array.Empty<string>() }
              });
                #endregion
            });
        }

        /// <summary>
        /// 
        /// </summary>
        public static void Config(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseSwagger();
            //启用中间件服务对swagger-ui,指定Swagger JSON终结点
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("v1/swagger.json", "WebApi");
                c.RoutePrefix = "swagger";
                c.DocExpansion(DocExpansion.None);
            });
        }
    }

    public class DocF : IDocumentFilter
    {
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            swaggerDoc.Tags = new List<OpenApiTag>()
            {

                 new OpenApiTag()
                {
                    Name = "Login",
                    Description = "登录模块"
                }

            };
        }
    }

  我的swaggerconfig 添加了jwt的token不需要的可以删除红色部分

3.在statup文件配置swagger

public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();//跨域

            services.AddControllers(options =>
            {
          options.UseCentralRoutePrefix(new RouteAttribute("api/[controller]"));
            });

            SwaggerConfig.Register(services);//添加swagger
        }
 public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime, IWebHostEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            //跨域
            app.UseCors(options => options.SetIsOriginAllowed(x => _ = true).AllowAnyMethod().AllowAnyHeader().AllowCredentials());
            SwaggerConfig.Config(app, env);//添加swagger
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();

            ////认证
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

 4.如果不想在每个接口前加路由信息的话,做一个统一路由的配置中间件

/// <summary>
    /// 路由配置信息
    /// </summary>
    public class CentralRouteMiddleware : IApplicationModelConvention
    {
        ///<summary>
        /// 定义一个路由前缀变量
        /// </summary>
        private readonly AttributeRouteModel _centralPrefix;
        /// <summary>
        /// 调用时传入指定的路由前缀
        /// </summary>
        /// <param name="routeTemplateProvider"></param>
        public CentralRouteMiddleware(IRouteTemplateProvider routeTemplateProvider)
        {
            _centralPrefix = new AttributeRouteModel(routeTemplateProvider);
        }

        public void Apply(ApplicationModel application)
        {
            //遍历所有的 Controller
            foreach (var controller in application.Controllers)
            {
                var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
                if (matchedSelectors.Any())
                {
                    foreach (var selectorModel in matchedSelectors)
                    {
                        selectorModel.AttributeRouteModel = new AttributeRouteModel();
                    }
                }
                foreach (var item in controller.Actions)
                {

                    foreach (var selectorModel in item.Selectors)
                    {
                        if (selectorModel.AttributeRouteModel != null)
                        {
                            selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix, selectorModel.AttributeRouteModel);
                        }
                        else
                        {
                            selectorModel.AttributeRouteModel = new AttributeRouteModel(new RouteAttribute("api/[controller]/[action]"));
                        }
                    }
                }
            }
        }
    }

    /// <summary>
    /// mvc 扩展类
    /// </summary>
    public static class MvcOptionsExtensions
    {
        /// <summary>
        /// 扩展方法
        /// </summary>
        /// <param name="opts"></param>
        /// <param name="routeAttribute"></param>
        public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
        {
            opts.Conventions.Insert(0, new CentralRouteMiddleware(routeAttribute));
        }
    }
}  

5.地址栏输入http:localhost:5001/swagger就可以啦

  

以上是关于Swagger入门的主要内容,如果未能解决你的问题,请参考以下文章

csharp 在Swashbuckle Swagger中,此片段允许按字母顺序显示操作。

Swagger入门教程

Swagger入门教程(转)

Swagger(丝袜哥) 快速入门(超详细介绍)

springboot2.0入门--swagger2接口API构建

Swagger 3.0快速入门