一、前言

自从之前写了一篇《Webapi文档描述-swagger优化》这篇文章后,欠了大家一篇使用文档的说明,现在给大家补上哈。

二、环境

  • .Net Framework 4.5
  • WebApi 2
  • SwashbuckleEx 1.1.2:个人修改后的版本

三、SwashbuclkeEx 优化说明

  • 汉化:支持中、英文。
  • 接口搜索:模块名、注释名、接口名
  • 注释:控制器备注、开发进度说明、开发人员注释
  • 区域文档分组:支持多种文档切换、并分组显示在左侧,可通过点击进行切换文档
  • 接口数量统计

展示如下:





三、SwashbuckleEx 使用文档

4.1 安装SwashbuckleEx

  1. Install-Package SwashbuckleEx

4.2 包含指定XML注释文件

  • 设置库生成Xml文件:右键点击项目属性->生成->输出 勾选Xml文档文件

  • 配置注释文件:IncludeXmlComments('绝对路径'),可配置多个,但是发布服务器的时候需要将XML带上,如果没有则会访问报错。
  1. GlobalConfiguration.Configuration
  2. .EnableSwagger(c =>
  3. {
  4. c.IncludeXmlComments(string.Format("{0}/bin/SwashbuckleEx.WebApiTest.XML", AppDomain.CurrentDomain.BaseDirectory));
  5. }

4.3 简单Api文档信息配置-单文档

  • 配置Api版本信息:SingleApiVersion('版本','文档标题')
  • 配置联系方式:Contarct
    • 邮箱:Email
    • 创建人:Name
    • 联系地址:Url
  • 配置许可证:Lincese
    • 许可证名称:Name
    • 地址:Url
  • 配置备注:Description('自定义内容')
  • 配置服务条款:TermsOfService('条款内容')。这个方法没看到在界面哪个地方展示。

配置代码如下:

  1. GlobalConfiguration.Configuration
  2. .EnableSwagger(c =>
  3. {
  4. c.SingleApiVersion("v1", "Test.WebApi").Contact(x =>
  5. {
  6. x.Email("jianxuanhuo1@126.com");
  7. x.Name("jian玄冰");
  8. x.Url("https://www.cnblogs.com/jianxuanbing");
  9. }).TermsOfService("jian玄冰").License(x =>
  10. {
  11. x.Name("MIT");
  12. x.Url("https://www.cnblogs.com/jianxuanbing");
  13. }).Description("自定义文案内容,可以随便输入内容");
  14. }

效果图如下:

4.4 多版本Api文档信息配置-多文档

该方式主要用于API版本处理使用,但是本人用区域进行划分,用于分隔多个系统的接口。

  • 路由配置:WebApiConfig.cs
  1. public static class WebApiConfig
  2. {
  3. public static void Register(HttpConfiguration config)
  4. {
  5. // Web API 路由
  6. config.MapHttpAttributeRoutes();
  7. config.Routes.MapHttpRoute(
  8. name: "AdminApi",
  9. routeTemplate: "api/Admin/{controller}/{action}/{id}",
  10. defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Admin.Controllers" } });
  11. config.Routes.MapHttpRoute(
  12. name: "ClientApi",
  13. routeTemplate: "api/Client/{controller}/{action}/{id}",
  14. defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Client.Controllers" } });
  15. config.Routes.MapHttpRoute(
  16. name: "CommonApi",
  17. routeTemplate: "api/{controller}/{action}/{id}",
  18. defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Controllers" } }
  19. );
  20. }
  21. }
  • 配置Api版本信息:MultipleApiVersions()

    Version进行了修改,提供支持默认路由
  1. public static void Register()
  2. {
  3. GlobalConfiguration.Configuration
  4. .EnableSwagger(c =>
  5. {
  6. c.MultipleApiVersions(ResolveAreasSupportByRouteConstraint, (vc) =>
  7. {
  8. vc.Version("Admin", "中文后台 API").Description("这个用于测试一下备注信息").TermsOfService("jian玄冰").License(
  9. x =>
  10. {
  11. x.Name("jian玄冰");
  12. x.Url("https://www.cnblogs.com/jianxuanbing");
  13. })
  14. .Contact(x =>
  15. {
  16. x.Name("2017").Email("jianxuanhuo1@126.com").Url("www.baidu.xxxx");
  17. });
  18. vc.Version("v1", "Common API", true);// 设置为默认路由
  19. vc.Version("Client", "Client API");
  20. });
  21. // 添加区域路由文档过滤
  22. c.DocumentFilter<AddAreasSupportDocumentFilter>();
  23. }
  24. }
  25. // 处理默认路由以及区域路由问题
  26. private static bool ResolveAreasSupportByRouteConstraint(ApiDescription apiDescription, string targetApiVersion)
  27. {
  28. if (targetApiVersion == "v1")
  29. {
  30. return apiDescription.Route.RouteTemplate.StartsWith("api/{controller}");
  31. }
  32. var routeTemplateStart = "api/" + targetApiVersion;
  33. return apiDescription.Route.RouteTemplate.StartsWith(routeTemplateStart);
  34. }

4.5 区域文档过滤

用于区分每个区域内文档切换问题,仅供参考,因为里面调整的内容与命名空间.相关。

  1. /// <summary>
  2. /// 添加 Area 文档过滤器
  3. /// </summary>
  4. public class AddAreasSupportDocumentFilter:IDocumentFilter
  5. {
  6. /// <summary>
  7. /// 配置
  8. /// </summary>
  9. private readonly SwaggerConfiguration _config = ConfigProvider.Default.GetConfiguration<SwaggerConfiguration>();
  10. /// <summary>
  11. /// 重写Apply方法,加入Area文档处理
  12. /// </summary>
  13. public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
  14. {
  15. IDictionary<string,PathItem> replacePaths=new ConcurrentDictionary<string, PathItem>();
  16. foreach (var item in swaggerDoc.paths)
  17. {
  18. // api/Areas/Namespace.Controller/Action
  19. string key = item.Key;
  20. if (key.Contains(_config.JwtRoute))
  21. {
  22. replacePaths.Add(item.Key,item.Value);
  23. continue;
  24. }
  25. var value = item.Value;
  26. var keys = key.Split('/');
  27. // Areas路由:keys[0]:"",keys[1]:api,keys[2]:Areas,keys[3]:{ProjectName}.Api.Areas.{AreaName}.Controllers.{ControllerName}Controller,keys[4]:{ActionName}
  28. if (keys[3].IndexOf('.') != -1)
  29. {
  30. // 区域路径
  31. string areaName = keys[2];
  32. string namespaceFullName = keys[3];
  33. var directoryNames = namespaceFullName.Split('.');
  34. string namespaceName = directoryNames[3];
  35. if (areaName.Equals(namespaceName, StringComparison.OrdinalIgnoreCase))
  36. {
  37. string controllerName = directoryNames[5];
  38. replacePaths.Add(
  39. item.Key.Replace(namespaceFullName,
  40. controllerName.Substring(0,
  41. controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)),
  42. value);
  43. }
  44. }
  45. // 通用路由:keys[0]:"",keys[1]:api,keys[2]:{ProjectName}.Api.Controllers.{ControllerName}Controller,keys[3]:{ActionName}
  46. else if (keys[2].IndexOf('.') != -1)
  47. {
  48. // 基础路径
  49. string namespaceFullName = keys[2];
  50. var directoryNames = namespaceFullName.Split('.');
  51. bool isControllers = directoryNames[2].Equals("Controllers", StringComparison.OrdinalIgnoreCase);
  52. string controllerName = directoryNames[3];
  53. if (isControllers)
  54. {
  55. replacePaths.Add(
  56. item.Key.Replace(namespaceFullName,
  57. controllerName.Substring(0,
  58. controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)), value);
  59. }
  60. }
  61. swaggerDoc.paths = replacePaths;
  62. }
  63. }
  64. }

4.6 显示上传文件参数

SwaggerUI 有上传文件的功能,与添加自定义HTTP Header做法相类似,我们可以通过特性来标识API是否具有上传功能。

  1. /// <summary>
  2. /// 添加 上传操作过滤
  3. /// </summary>
  4. public class AddUploadOperationFilter:IOperationFilter
  5. {
  6. /// <summary>
  7. /// 重写Apply方法,加入Upload操作过滤
  8. /// </summary>
  9. public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
  10. {
  11. var upload = apiDescription.ActionDescriptor.GetCustomAttributes<UploadAttribute>().FirstOrDefault();
  12. if (upload == null)
  13. {
  14. return;
  15. }
  16. operation.consumes.Add("application/form-data");
  17. operation.parameters.Add(new Parameter()
  18. {
  19. name = upload.Name,
  20. @in = "formData",
  21. required = upload.Require,
  22. type = "file",
  23. description = upload.Description
  24. });
  25. }
  26. }
  27. /// <summary>
  28. /// 上传属性,用于标识接口是否包含上传信息参数
  29. /// </summary>
  30. public class UploadAttribute:Attribute
  31. {
  32. /// <summary>
  33. /// 参数名
  34. /// </summary>
  35. public string Name { get; set; } = "file";
  36. /// <summary>
  37. /// 是否必须包含文件
  38. /// </summary>
  39. public bool Require { get; set; } = true;
  40. /// <summary>
  41. /// 备注
  42. /// </summary>
  43. public string Description { get; set; } = "";
  44. }

然后再SwaggerConfig.csEnableSwagger配置类添加一行操作过滤注册代码即可。

  1. c.OperationFilter<AddUploadOperationFilter>();

效果图如下:

4.7 自定义接口备注内容

由于不想将一些跟接口名无关的信息放在接口名那里,那么这个时候可以将部分业务相关的注释放在<remarks></remarks>标签当中

  1. /// <summary>
  2. /// 获取后台Guid
  3. /// </summary>
  4. /// <remarks>
  5. /// 测试一些内容,不想将无用的东西放在接口名称当中<br/>
  6. /// 换行输出一下内容
  7. /// </remarks>
  8. /// <returns></returns>
  9. [HttpGet]
  10. [ApiAuthor(Name = "jian玄冰",Status = DevStatus.Wait,Time = "2018-04-28")]
  11. public Guid GetGuid()
  12. {
  13. return Guid.NewGuid();
  14. }

效果图如下:

4.8 设置接口开发信息

增加ApiAuthor特性,用于设置接口开发状态、开发人、完成时间等相关信息。

  1. /// <summary>
  2. /// 获取后台Guid
  3. /// </summary>
  4. /// <remarks>
  5. /// 测试一些内容,不想将无用的东西放在接口名称当中<br/>
  6. /// 换行输出一下内容
  7. /// </remarks>
  8. /// <returns></returns>
  9. [HttpGet]
  10. [AllowAnonymous]
  11. [ApiAuthor(Name = "jian玄冰",Status = DevStatus.Wait,Time = "2018-04-28")]
  12. public Guid GetGuid()
  13. {
  14. return Guid.NewGuid();
  15. }

然后再SwaggerConfig.csEnableSwagger配置类添加一行启用代码即可。

  1. c.ShowDeveloperInfo();

效果图如下:

4.9 自定义响应信息

使用SwaggerResponse特性,可用于生成自定义响应结果实体、状态码、响应信息备注等信息,多用于返回类型为HttpResponseMessage结果。

参数说明:

  • 状态码:StatusCode,用于设置返回成功状态的状态码
  • 备注:Description,用于设置响应类备注信息
  • 类型:Type,用于设置返回结果类型的实体。这是主要设置项,因为返回类型HttpResponseMessage无法解析出结果类型。
  1. /// <summary>
  2. /// 获取用户信息
  3. /// </summary>
  4. /// <returns></returns>
  5. [HttpGet]
  6. [SwaggerResponse(HttpStatusCode.OK,"自定义内容",Type = typeof(UserInfo))]
  7. public HttpResponseMessage GetUserInfo()
  8. {
  9. return Request.CreateResponse(HttpStatusCode.OK, new UserInfo(), "application/json");
  10. }

效果图如下:

五、源码地址

https://github.com/jianxuanbing/SwashbuckleEx

Swagger使用教程 SwashbuckleEx的更多相关文章

  1. Swagger入门教程

    [译]5.41 Swagger tutorial 单击此处查看原文 更多概念参见:Implementing Swagger with your API docs 关于 Swagger Swagger能 ...

  2. Swagger入门教程(转)

    [译]5.41 Swagger tutorial 单击此处查看原文 更多概念参见:Implementing Swagger with your API docs 关于 Swagger Swagger能 ...

  3. Swagger使用教程大全,从入门到精通

    Swagger是遵守OpenAPI规范(OAS)的世界上最大的API框架开发工具,可在整个API生命周期内进行开发,从设计和文档到测试和部署.它提供了许多试用的工具来帮助开发者进行接口开发,如及时接口 ...

  4. Swagger UI及 Swagger editor教程 API文档搭配 Node使用

    swagger ui 是一个在线文档生成和测试的利器,目前发现最好用的.为啥好用呢?打开 demo,支持API自动生成同步的在线文档些文档可用于项目内部API审核方便测试人员了解 API这些文档可作为 ...

  5. Asp.Net WebApi swagger使用教程

    swagger简介 别名:丝袜哥 功能:用于生产api文档 swagger安装 Nuget搜索swagger,然后安装Swashbuckle swagger使用 生成api的xml文档 webapi项 ...

  6. Swagger UI教程 API 文档神器 搭配Node使用

    ASP.NET Web API 使用Swagger生成在线帮助测试文档 Swagger 生成 ASP.NET Web API 前言 swagger ui是一个API在线文档生成和测试的利器,目前发现最 ...

  7. Swagger UI教程

    文档源地址 http://www.68idc.cn/help/makewebs/qitaasks/20160621620667.html Swagger-UI本身只提供在线测试功能,要集成它还需要告诉 ...

  8. Spring Boot整合swagger使用教程

    目录 Swagger的介绍 优点与缺点 添加swagger 1.添加依赖包: 2.配置Swagger: 3.测试 场景: 定义接口组 定义接口 定义接口请求参数 场景一:请求参数是实体类. 场景二:请 ...

  9. Swagger简明教程

    一.什么是swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法, ...

随机推荐

  1. JavaScript -- Math

    ----- 016-Math.html ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  2. js便签笔记(8)——js加载XML字符串或文件

    1. 加载XML文件 方法1:ajax方式.代码如下: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObje ...

  3. js便签笔记(7)——style、currentStyle、getComputedStyle区别介绍【转载】

    转者语: 今天看jQuery源码CSS部分,里面用到了currentStyle和getComputedStyle来获取外部样式. 因为elem.style.width只能获取elem的style属性里 ...

  4. Linux安装go语言开发包

    1.下载go语言安装包,eg:go1.7.1.linux-amd64.tar.gz2.安装go语言 $ cd /home/xm6f/dev $ tar -zxvf go1.7.1.linux-amd6 ...

  5. 如何查找SHELL的进程号并杀死

    一.shell查找进程并杀死 #!/bin/sh tomcat_id=`ps -ef | grep tomcat | grep -v "grep" | awk '{print $2 ...

  6. CUBA Studio 8.0 发布,企业级应用开发平台

    CUBA Platform 是一款开源且免费的企业级应用开发框架,已有将近10年的发展历史,由俄罗斯的 Haulmont  公司开发,CUBA Platform 近期将正式登陆中国,将提供中文网站.中 ...

  7. [转]Microsoft SQL SERVER 2008 R2 REPORT SERVICE 匿名登录

    本文转自:https://www.cnblogs.com/Zouzhe/p/5736070.html SQL SERVER 2008 R2 是微软目前最新的数据库版本,在之前的SQL SERVER 2 ...

  8. webpack打包优化并开启gzip

    应用场景:项目使用webpack2.x进行打包,打包后静态资源通过nginx转发配置: 问题:webpack打包后的资源文件特别,特别大,没打包之前页面一个页面js有2M左右(其中已经抽离了css)? ...

  9. WebFrom与MVC异同

    一.共同点 它们共用一套管道机制. 二.不同点: 1.开发方式: webform开发方式 第一步:前台页面(*.aspx)+后置代码类(*.cs) 第二步:前台页面(*.aspx)+一般处理程序(*h ...

  10. 详解contextConfigLocation|Spring启动过程详解

    spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好看看这个流程.我们在开发spring的项目当中基本上都会在web.xml通过: <context-param> ...