随着技术的不断发展,网站框架也开始向:前后端分离的形态发展,而且前端技术和后端技术在各自的道路上越走越远。而web api 接口成了前后端唯一的联系。所以web api会变得越来越重要。

那么什么是Web Api呢?

主要有两点   1.可以对接各种客户端(浏览器,移动设备)

      2.构建http服务的框架。

而我们今天要学的Swagger是一款可以让你更好的开发api的框架。

关于 Swagger

Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因:

  • Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API。
  • Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现。
  • Swagger 文件可以在许多不同的平台上从代码注释中自动生成。
  • Swagger 有一个强大的社区,里面有许多强悍的贡献者。

Swagger实战

1.创建WebApi项目:直接新建项目》ASP.NET Web应用程序》Web Api。就可以创一个web api模板,直接运行,查看api接口。我们可以从下图看出默认的api管理不是很方便,而且看起来丑爆了。

2.接下来就是使用Swagger,首先是安装Swagger,打开管理Nuget程序包,搜索swashbuckle,选中安装即可。

3.安装成功后,选中项目后右键属性》生成》勾选输出.XML文档文件,然后保存。运行项目就会生成文件bin\Swagger.Web.Api.xml。(这一步很重要)

4.接下来配置App_Start文件夹里SwaggerConfig.cs文件,如下图所示;

  1. public class SwaggerConfig
  2. {
  3. public static void Register()
  4. {
  5. var thisAssembly = typeof(SwaggerConfig).Assembly;
  6.  
  7. GlobalConfiguration.Configuration
  8. .EnableSwagger(c =>
  9. {
  10. c.SingleApiVersion("v1", "Swagger.Web.Api");
  11.  
  12. c.IncludeXmlComments(GetXmlCommentsPath());
  13.  
  14. })
  15. .EnableSwaggerUi(c =>
  16. {
  17. c.DocumentTitle("My Swagger UI");
  18. });
  19. }
  20. /// <summary>
  21. /// 获取xml文件
  22. /// </summary>
  23. /// <returns></returns>
  24. protected static string GetXmlCommentsPath()
  25. {
  26. return System.String.Format(@"{0}\bin\Swagger.Web.Api.xml", System.AppDomain.CurrentDomain.BaseDirectory);
  27. }
  28. }

SwaggerConfig

5.还有要修改默认打开路径,设置为直接打开swagger。

6.运行项目,完美显示接口。详细用法,自己摸索就行了,没有什么难度。

Swagger汉化

1.创建文件swaggger_lang.js,路径位置可以参考下图。(注意swaggger_lang.js的属性》生成操作:设置为嵌入的资源,因为swagger里的资源都是嵌入到dll里的,我们常用的资源文件都是以内容的方式放在项目中的,我们也可以以嵌入的资源方式引入到项目中)

  1. /// <summary>
  2. /// 中文转换
  3. /// </summary>
  4. var SwaggerTranslator = (function () {
  5. //定时执行检测是否转换成中文,最多执行500次 即500*50/1000=25s
  6. var iexcute = 0,
  7. //中文语言包
  8. _words = {
  9. "Warning: Deprecated": "警告:已过时",
  10. "Implementation Notes": "实现备注",
  11. "Response Class": "响应类",
  12. "Status": "状态",
  13. "Parameters": "参数",
  14. "Parameter": "参数",
  15. "Value": "值",
  16. "Description": "描述",
  17. "Parameter Type": "参数类型",
  18. "Data Type": "数据类型",
  19. "Response Messages": "响应消息",
  20. "HTTP Status Code": "HTTP状态码",
  21. "Reason": "原因",
  22. "Response Model": "响应模型",
  23. "Request URL": "请求URL",
  24. "Response Body": "响应体",
  25. "Response Code": "响应码",
  26. "Response Headers": "响应头",
  27. "Hide Response": "隐藏响应",
  28. "Headers": "头",
  29. "Try it out!": "试一下!",
  30. "Show/Hide": "显示/隐藏",
  31. "List Operations": "显示操作",
  32. "Expand Operations": "展开操作",
  33. "Raw": "原始",
  34. "can't parse JSON. Raw result": "无法解析JSON. 原始结果",
  35. "Model Schema": "模型架构",
  36. "Model": "模型",
  37. "apply": "应用",
  38. "Username": "用户名",
  39. "Password": "密码",
  40. "Terms of service": "服务条款",
  41. "Created by": "创建者",
  42. "See more at": "查看更多:",
  43. "Contact the developer": "联系开发者",
  44. "api version": "api版本",
  45. "Response Content Type": "响应Content Type",
  46. "fetching resource": "正在获取资源",
  47. "fetching resource list": "正在获取资源列表",
  48. "Explore": "浏览",
  49. "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
  50. "Can't read from server. It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置access-control-origin。",
  51. "Please specify the protocol for": "请指定协议:",
  52. "Can't read swagger JSON from": "无法读取swagger JSON于",
  53. "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染Swagger UI",
  54. "Unable to read api": "无法读取api",
  55. "from path": "从路径",
  56. "Click to set as parameter value": "点击设置参数",
  57. "server returned": "服务器返回"
  58. },
  59.  
  60. //定时执行转换
  61. _translator2Cn = function () {
  62. if ($("#resources_container .resource").length > 0) {
  63. _tryTranslate();
  64. }
  65.  
  66. if ($("#explore").text() == "Explore" && iexcute < 500) {
  67. iexcute++;
  68. setTimeout(_translator2Cn, 50);
  69. }
  70. },
  71.  
  72. //设置控制器注释
  73. _setControllerSummary = function () {
  74. $.ajax({
  75. type: "get",
  76. async: true,
  77. url: $("#input_baseUrl").val(),
  78. dataType: "json",
  79. success: function (data) {
  80. var summaryDict = data.ControllerDesc;
  81. var id, controllerName, strSummary;
  82. $("#resources_container .resource").each(function (i, item) {
  83. id = $(item).attr("id");
  84. if (id) {
  85. controllerName = id.substring(9);
  86. strSummary = summaryDict[controllerName];
  87. if (strSummary) {
  88. $(item).children(".heading").children(".options").prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>');
  89. }
  90. }
  91. });
  92. }
  93. });
  94. },
  95.  
  96. //尝试将英文转换成中文
  97. _tryTranslate = function () {
  98. $('[data-sw-translate]').each(function () {
  99. $(this).html(_getLangDesc($(this).html()));
  100. $(this).val(_getLangDesc($(this).val()));
  101. $(this).attr('title', _getLangDesc($(this).attr('title')));
  102. });
  103. },
  104. _getLangDesc = function (word) {
  105. return _words[$.trim(word)] !== undefined ? _words[$.trim(word)] : word;
  106. };
  107.  
  108. return {
  109. Translator: function () {
  110. //可以重写页面title
  111. //document.title = "API描述文档";
  112. $('body').append('<style type="text/css">.controller-summary{color:#10a54a !important;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px;text-align:right;cursor:default;} </style>');
  113. $("#logo").html("接口描述").attr("href", "/Home/Index");
  114. //设置控制器描述
  115. _setControllerSummary();
  116. _translator2Cn();
  117. }
  118. }
  119. })();
  120. //执行转换
  121. SwaggerTranslator.Translator();

swagger_lang.js

2.在swaggerconfig.cs里设置swaggger_lang.js的路径。在下图中添加如下代码

  1. c.InjectJavaScript(thisAssembly, "Swagger.UI.Api.Scripts.swaggerui.swagger_lang.js");

3.汉化工作就做完了,运行如下。

控制器描述

1.添加CachingSwaggerProvider.cs文件

  1. using Swashbuckle.Swagger;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Web;
  8. using System.Xml;
  9.  
  10. namespace Swagger.UI.Api
  11. {
  12. public class CachingSwaggerProvider : ISwaggerProvider
  13. {
  14. private static ConcurrentDictionary<string, SwaggerDocument> _cache =
  15. new ConcurrentDictionary<string, SwaggerDocument>();
  16.  
  17. private readonly ISwaggerProvider _swaggerProvider;
  18.  
  19. public CachingSwaggerProvider(ISwaggerProvider swaggerProvider)
  20. {
  21. _swaggerProvider = swaggerProvider;
  22. }
  23.  
  24. public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
  25. {
  26. var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
  27. SwaggerDocument srcDoc = null;
  28. //只读取一次
  29. if (!_cache.TryGetValue(cacheKey, out srcDoc))
  30. {
  31. srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
  32.  
  33. srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
  34. _cache.TryAdd(cacheKey, srcDoc);
  35. }
  36. return srcDoc;
  37. }
  38.  
  39. /// <summary>
  40. /// 从API文档中读取控制器描述
  41. /// </summary>
  42. /// <returns>所有控制器描述</returns>
  43. public static ConcurrentDictionary<string, string> GetControllerDesc()
  44. {
  45. string xmlpath = string.Format("{0}/bin/Swagger.UI.Api.XML", System.AppDomain.CurrentDomain.BaseDirectory);
  46. ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
  47. if (File.Exists(xmlpath))
  48. {
  49. XmlDocument xmldoc = new XmlDocument();
  50. xmldoc.Load(xmlpath);
  51. string type = string.Empty, path = string.Empty, controllerName = string.Empty;
  52.  
  53. string[] arrPath;
  54. int length = -, cCount = "Controller".Length;
  55. XmlNode summaryNode = null;
  56. foreach (XmlNode node in xmldoc.SelectNodes("//member"))
  57. {
  58. type = node.Attributes["name"].Value;
  59. if (type.StartsWith("T:"))
  60. {
  61. //控制器
  62. arrPath = type.Split('.');
  63. length = arrPath.Length;
  64. controllerName = arrPath[length - ];
  65. if (controllerName.EndsWith("Controller"))
  66. {
  67. //获取控制器注释
  68. summaryNode = node.SelectSingleNode("summary");
  69. string key = controllerName.Remove(controllerName.Length - cCount, cCount);
  70. if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
  71. {
  72. controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
  73. }
  74. }
  75. }
  76. }
  77. }
  78. return controllerDescDict;
  79. }
  80. }
  81. }

2.注意要将下图中位置的路径改成你自己项目路径。

3.在swaggerconfig.cs里配置CachingSwaggerProvider 。

  1. c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider));

错误解决

一个controller中只能有一个HttpGet请求,多了就会报错。建议减少重载方法,将其他Get方法分开,例如在其他方法上加[httppost]特性

如果在swagger.config中加上c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());也可以解决错误,但是会只显示第一个get方法

Swagger简单实例的更多相关文章

  1. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  2. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  3. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  4. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

  5. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  6. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  7. vue路由的简单实例

    vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...

  8. Flume概述和简单实例

    Flume概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方( ...

  9. jsoup解析HTML及简单实例

    jsoup 中文参考文献    http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...

随机推荐

  1. Set8087CW

    Set8087CWThis example accesses the Floating Point Unit (FPU) control register. Try turning floating ...

  2. js调用activeX插件 报异常:TypeError:对象不支持 属性方法

    部署之后的js网页如果调用没有签名的 ocx/dll 插件的话会报异常:TypeError:对象不支持 “init” 属性方法 (init为插件公开的方法) 但是如果写一个htm本地文件去调用插件,和 ...

  3. Windows Intel VT-x开启

    解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题 背景:win7 旗舰版 64位+VMware 10.0 启动虚拟机时报错 问题:已将该虚拟机 ...

  4. JBPM4.4学习笔记

    1.JBPM4表说明: JBPM4_DEPLOYMENT 流程定义表 JBPM4_DEPLOYPROP 流程定义属性表 JBPM4_EXECUTION 流程实例表 JBPM4_HIST_ACTINST ...

  5. url_encode and url_decode in Shell

    之前写过一版 shell下解码url,下面给出另外一个版本 from https://gist.github.com/cdown/1163649 function urlencode() { loca ...

  6. 动态添加一列到DataTable的第一列

    dt.Columns.Add("ROWNUM", typeof(Int64));dt.Columns["ROWNUM"].SetOrdinal(0);

  7. Perl 子程序(函数)

    1.Perl 子程序(函数)Perl 子程序也就是用户定义的函数.Perl 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读. Perl 子程序可以出现在程序的任何地方,语法 ...

  8. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  9. WWW缓存方式

    缓存方式 使用WWW.LoadFromCacheOrDownload接口.AssetBundles将保存在本地设备的Unity的缓存文件夹中.WebPlayer 有50MB的缓存上限,PC/Mac/A ...

  10. Windows 10 归档、对于一些问题的解决与软件推荐

    I'm a Windows Insider 最近加入了 Windows Insider 计划,主要目的还是为了体验一下马上(7.29)就要发售的 Windows 10 操作系统. 先简要介绍下 Win ...