一、前言

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

二、环境

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

三、SwashbuclkeEx 优化说明

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

展示如下:





三、SwashbuckleEx 使用文档

4.1 安装SwashbuckleEx

Install-Package SwashbuckleEx

4.2 包含指定XML注释文件

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

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

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

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

配置代码如下:

GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "Test.WebApi").Contact(x =>
{
x.Email("jianxuanhuo1@126.com");
x.Name("jian玄冰");
x.Url("https://www.cnblogs.com/jianxuanbing");
}).TermsOfService("jian玄冰").License(x =>
{
x.Name("MIT");
x.Url("https://www.cnblogs.com/jianxuanbing");
}).Description("自定义文案内容,可以随便输入内容");
}

效果图如下:

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

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

  • 路由配置:WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "AdminApi",
routeTemplate: "api/Admin/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Admin.Controllers" } });
config.Routes.MapHttpRoute(
name: "ClientApi",
routeTemplate: "api/Client/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Client.Controllers" } }); config.Routes.MapHttpRoute(
name: "CommonApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Controllers" } }
); }
}
  • 配置Api版本信息:MultipleApiVersions()

    Version进行了修改,提供支持默认路由
public static void Register()
{
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.MultipleApiVersions(ResolveAreasSupportByRouteConstraint, (vc) =>
{
vc.Version("Admin", "中文后台 API").Description("这个用于测试一下备注信息").TermsOfService("jian玄冰").License(
x =>
{
x.Name("jian玄冰");
x.Url("https://www.cnblogs.com/jianxuanbing");
})
.Contact(x =>
{
x.Name("2017").Email("jianxuanhuo1@126.com").Url("www.baidu.xxxx");
});
vc.Version("v1", "Common API", true);// 设置为默认路由 vc.Version("Client", "Client API");
});
// 添加区域路由文档过滤
c.DocumentFilter<AddAreasSupportDocumentFilter>();
}
} // 处理默认路由以及区域路由问题
private static bool ResolveAreasSupportByRouteConstraint(ApiDescription apiDescription, string targetApiVersion)
{
if (targetApiVersion == "v1")
{
return apiDescription.Route.RouteTemplate.StartsWith("api/{controller}");
}
var routeTemplateStart = "api/" + targetApiVersion;
return apiDescription.Route.RouteTemplate.StartsWith(routeTemplateStart);
}

4.5 区域文档过滤

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

/// <summary>
/// 添加 Area 文档过滤器
/// </summary>
public class AddAreasSupportDocumentFilter:IDocumentFilter
{
/// <summary>
/// 配置
/// </summary>
private readonly SwaggerConfiguration _config = ConfigProvider.Default.GetConfiguration<SwaggerConfiguration>(); /// <summary>
/// 重写Apply方法,加入Area文档处理
/// </summary>
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
IDictionary<string,PathItem> replacePaths=new ConcurrentDictionary<string, PathItem>();
foreach (var item in swaggerDoc.paths)
{
// api/Areas/Namespace.Controller/Action
string key = item.Key;
if (key.Contains(_config.JwtRoute))
{
replacePaths.Add(item.Key,item.Value);
continue;
} var value = item.Value;
var keys = key.Split('/'); // Areas路由:keys[0]:"",keys[1]:api,keys[2]:Areas,keys[3]:{ProjectName}.Api.Areas.{AreaName}.Controllers.{ControllerName}Controller,keys[4]:{ActionName}
if (keys[3].IndexOf('.') != -1)
{
// 区域路径
string areaName = keys[2];
string namespaceFullName = keys[3];
var directoryNames = namespaceFullName.Split('.');
string namespaceName = directoryNames[3];
if (areaName.Equals(namespaceName, StringComparison.OrdinalIgnoreCase))
{
string controllerName = directoryNames[5];
replacePaths.Add(
item.Key.Replace(namespaceFullName,
controllerName.Substring(0,
controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)),
value);
}
}
// 通用路由:keys[0]:"",keys[1]:api,keys[2]:{ProjectName}.Api.Controllers.{ControllerName}Controller,keys[3]:{ActionName}
else if (keys[2].IndexOf('.') != -1)
{
// 基础路径
string namespaceFullName = keys[2];
var directoryNames = namespaceFullName.Split('.');
bool isControllers = directoryNames[2].Equals("Controllers", StringComparison.OrdinalIgnoreCase);
string controllerName = directoryNames[3];
if (isControllers)
{
replacePaths.Add(
item.Key.Replace(namespaceFullName,
controllerName.Substring(0,
controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)), value);
}
} swaggerDoc.paths = replacePaths;
}
}
}

4.6 显示上传文件参数

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

/// <summary>
/// 添加 上传操作过滤
/// </summary>
public class AddUploadOperationFilter:IOperationFilter
{
/// <summary>
/// 重写Apply方法,加入Upload操作过滤
/// </summary>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var upload = apiDescription.ActionDescriptor.GetCustomAttributes<UploadAttribute>().FirstOrDefault();
if (upload == null)
{
return;
}
operation.consumes.Add("application/form-data");
operation.parameters.Add(new Parameter()
{
name = upload.Name,
@in = "formData",
required = upload.Require,
type = "file",
description = upload.Description
});
}
} /// <summary>
/// 上传属性,用于标识接口是否包含上传信息参数
/// </summary>
public class UploadAttribute:Attribute
{
/// <summary>
/// 参数名
/// </summary>
public string Name { get; set; } = "file"; /// <summary>
/// 是否必须包含文件
/// </summary>
public bool Require { get; set; } = true; /// <summary>
/// 备注
/// </summary>
public string Description { get; set; } = "";
}

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

c.OperationFilter<AddUploadOperationFilter>();

效果图如下:

4.7 自定义接口备注内容

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

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

效果图如下:

4.8 设置接口开发信息

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

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

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

c.ShowDeveloperInfo();

效果图如下:

4.9 自定义响应信息

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

参数说明:

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

效果图如下:

五、源码地址

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. 关于 OpenIdConnect 认证启用 HTTPS 回调 RedirectUri 不生效问题

    在搭建 IdentityServer 服务端后,我们尝试使用了 OIDC(OpenID Connect) 的中间件来代替了原先的 Session 系统认证方式,起初采用的是 HTTP 协议,一切都没有 ...

  2. Java 并发优化

    线程不安全 SimpleDateFormat不是线程安全的 SimpleDateThread import java.text.ParseException; import java.text.Sim ...

  3. StreamSets学习系列之启动StreamSets时出现Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "test.to.ensure.security.is.configured.correctly" "read")错误的解决办法

    不多说,直接上干货! 问题详情 [hadoop@master streamsets-datacollector-]$ ./bin/streamsets dc Java 1.8 detected; ad ...

  4. MYSQL中常用的强制性操作(例如强制索引)

    mysql常用的hint 对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的 ...

  5. filebeat-1-连通logstash

    类似flume, 但功能更为强大 Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并 ...

  6. Linux交换空间和内存不足

    交换空间 交换技术就是将一页内存复制到预先设定的硬盘上的交换空间,来释放该页占用内存.物理内存和交换空间的和就是可提供的虚拟内存的总量.Linux有两种形式的交换方式,分别是交换分区,交换文件. 优点 ...

  7. 资深程序员的Metal入门教程总结

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由落影发表于云+社区专栏 正文 本文介绍Metal和Metal Shader Language,以及Metal和OpenGL ES的差异 ...

  8. 软件架构设计学习总结(4):大数据架构hadoop

    摘要:Admaster数据挖掘总监 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海量数据的时代,数据调查公司IDC预计2011年的数据总量将达到1.8万亿GB,对这些海 ...

  9. elasticsearch安装ansj分词器

    1.概述    elasticsearch用于搜索引擎,需要设置一些分词器来优化索引.常用的有ik_max_word: 会将文本做最细粒度的拆分.ik_smart: 会做最粗粒度的拆分.ansj等. ...

  10. mac 上位Idea 配置Project SDK

    问题 刚开始没有Project SDK 方法 添加SDK: /Library/Java/JavaVirtualMachines/jdkXYZ_VERSION.jdk/Contents/Home/jre ...