.Net Core WebApi(2)—Swagger

上一个版本的入门Swagger提示不够完整,这章着重完善和优化

Swagger用于将我们编写的接口自动生成规范化的文档,便于进行测试和对接 
 
一.创建Swagger
1.1  Nuget 安装  Swashbuckle.AspNetCore
如图:
 
 
1.2  添加服务
在Startup.cs中,编辑Configure和ConfigureServices
 
 1 // 使用此方法向容器添加服务
 2         public void ConfigureServices(IServiceCollection services)
 3         {
 4             services.AddMvc();
 5  
 6  
 7             #region Swagger
 8             services.AddSwaggerGen(c =>
 9             {
10                 c.SwaggerDoc("v1", new Info
11                 {
12                     Version = "v1.1.0",
13                     Title = " MyAPi", 
14                 });
15             });
16             #endregion
17         }
18  
19  
20         // 使用此方法配置HTTP请求管道
21         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
22         {
23             if (env.IsDevelopment())
24             {
25                 app.UseDeveloperExceptionPage();
26             }
27  
28  
29             app.UseMvc();
30  
31  
32             #region Swagger
33             app.UseSwagger();
34             app.UseSwaggerUI(c =>
35             {
36                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1");
37             });
38             #endregion
39         }

 

 此时运行, 在域名后加/Swagger,确认即可看到Swagger的UI界面
 
二.优化Swagger
 
2.1 设置为启动项
修改launchSettings.json中的“launchUrl”,系统即可运行后直接显示SwaggerUI界面
 
 
2.2 接口参数提示
(1)右击项目文件=》属性=》生成=》输出=》勾选“生成xml文档”。
编译成功后,就会在对应的文件夹下生成自己命名的XML文件
 
(2)读取上一步生成的XML
  启动类Startup.cs中添加Swagger服务读取这个XML文件
  Nuget 安装  Microsoft.Extensions.PlatformAbstractions;
 
 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3             services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 4             #region Swagger
 5             services.AddSwaggerGen(s =>
 6             {
 7                 s.SwaggerDoc("v1", new Info
 8                 {
 9                     Version = "v1.1.0",
10                     Title = "  WebAPI" 
11                 });
12                 //添加读取注释服务
13                 var basePath = 
14                PlatformServices.Default.Application.ApplicationBasePath;
15                 //项目属性 XML的配置名称  APIHelp.xml
16                 var xmlPath = Path.Combine(basePath, "APIHelper.xml");
17                 s.IncludeXmlComments(xmlPath);
18             });
19             #endregion
20 }

 

运行后,如下图所示:
 
 2.3 控制器名称提示
创建文件夹“ SwaggerHelp”,添加“ SwaggerDocTag.cs”,完整代码如下
 1 using Microsoft.Extensions.PlatformAbstractions;
 2 using Swashbuckle.AspNetCore.Swagger;
 3 using Swashbuckle.AspNetCore.SwaggerGen;
 4 using System;
 5 using System.Collections.Generic;
 6 using System.IO;
 7 using System.Linq;
 8 using System.Threading.Tasks;
 9 using System.Xml;
10 namespace CWIOS.WebApi.SwaggerHelp
11 {
12     /// <summary>
13     /// Swagger注释帮助类
14     /// </summary>
15     public class SwaggerDocTag : IDocumentFilter
16     {
17         /// <summary>
18         /// 添加附加注释 初始化
19         /// </summary>
20         /// <param name="swaggerDoc"></param>
21         /// <param name="context"></param>
22         public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
23         {
24             swaggerDoc.Tags = GetControllerDesc();
25         }
26         /// <summary>
27         /// 从xml注释中读取控制器注释
28         /// </summary>
29         /// <returns></returns>
30         private List<Tag> GetControllerDesc()
31         {
32             List<Tag> tagList = new List<Tag>();
33             var basePath = PlatformServices.Default.Application.ApplicationBasePath;
34             var xmlpath = Path.Combine(basePath, "APIHelper.xml");
35             if (!File.Exists(xmlpath))//检查xml注释文件是否存在
36                 return tagList;
37             XmlDocument xmlDoc = new XmlDocument();
38             xmlDoc.Load(xmlpath);
39             string memberName = string.Empty;//xml三级节点的name属性值
40             string controllerName = string.Empty;//控制器完整名称
41             string key = string.Empty;//控制器去Controller名称
42             string value = string.Empty;//控制器注释
43             foreach (XmlNode node in xmlDoc.SelectNodes("//member"))//循环三级节点member
44             {
45                 memberName = node.Attributes["name"].Value;
46                 if (memberName.StartsWith("T:"))//T:开头的代表类
47                 {
48                     string[] arrPath = memberName.Split('.');
49                     controllerName = arrPath[arrPath.Length - 1];
50                     if (controllerName.EndsWith("Controller"))//Controller结尾的代表控制器
51                     {
52                         XmlNode summaryNode = node.SelectSingleNode("summary");//注释节点
53                         key = controllerName.Remove(controllerName.Length -  "Controller".Length, "Controller".Length);
54                         if (summaryNode != null &&  !string.IsNullOrEmpty(summaryNode.InnerText) && !tagList.Contains(new Tag { Name = key }))
55                         {
56                             value = summaryNode.InnerText.Trim();
57                             tagList.Add(new Tag { Name = key, Description = value });
58                         }
59                     }
60                 }
61             }
62             return tagList;
63         }
64     }
65 }

 

修改启动类“Startup.cs”中的“ConfigureServices”

 1  public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 4             #region Swagger
 5             services.AddSwaggerGen(s =>
 6             {
 7                 s.SwaggerDoc("v1", new Info
 8                 {
 9                     Version = "v1.1.0",
10                     Title = " WebAPI",
11                    
12                 });
13                 //添加读取注释服务
14                 var basePath = PlatformServices.Default.Application.ApplicationBasePath;
15                 //项目属性 XML的配置名称  APIHelp.xml
16                 var xmlPath = Path.Combine(basePath, "APIHelper.XML"); 
17                 s.IncludeXmlComments(xmlPath);
18  
19                 //添加对控制器的标签(描述)
20                 s.DocumentFilter<SwaggerDocTag>();
21             });
22             #endregion
23         }
24  

 

结果如下图:
 
2.4 实体类注释
新建类库“项目名称.Entity”,并添加“Student类”
  
public class Student
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
    }

 

(1) 生成实体类的XML文件,步骤类似2.2,不同的是生成路径需要修改,如下图:
 
在WebAPi项目中引用实体类库的dll,重新生成,在对应文件夹下能看到对应的两个XML
 
(2)读取实体类库的XML
修改启动类“Startup.cs”中的“ConfigureServices”,如下图所示:
   
 1 public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 4             #region Swagger
 5             services.AddSwaggerGen(s =>
 6             {
 7                 s.SwaggerDoc("v1", new Info
 8                 {
 9                     Version = "v1.1.0",
10                     Title = " WebAPI", 
11                    
12                 });
13                 //添加读取注释服务
14                 var basePath = PlatformServices.Default.Application.ApplicationBasePath;
15                 //项目属性 XML的配置名称  APIHelp.xml
16                 var xmlPath = Path.Combine(basePath, "APIHelper.XML");
17                 var entityXmlPath = Path.Combine(basePath, "CWIOS.Entity.xml");
18                 s.IncludeXmlComments(xmlPath,true);
19                 //添加实体层注释
20                 s.IncludeXmlComments(entityXmlPath);
21                 //添加对控制器的标签(描述)
22                 s.DocumentFilter<SwaggerDocTag>();
23             });
24             #endregion
25         }
26  

 

新增AddStudent 接口:
 1   /// <summary>
 2         /// 新增学生
 3         /// </summary>
 4         /// <param name="student">学生实体类</param>
 5         [HttpPost("AddStudent")]
 6         public ActionResult AddStudent(Student student)
 7         {
 8             return Ok("成功");
 9         }
10  

 

最终效果如下图所示:
 
posted @ 2019-09-10 17:45  y_w_k  阅读(463)  评论(0编辑  收藏  举报