Swagger使⽤⽅法详解(WebApi)——看完不会⽤你打我WebApi接⼝开发完毕后,交付给前端⼈员或⼿机端开发者时接⼝说明⽂档是必不可少的配套设备,如果公司流程不规范⼤家使⽤⼝⼝相传的交接⽅式,⽽且没有改进的欲望,那你可以到此为⽌了。Swagger是⽅便测试接⼝,快速展⽰注释内容,⽣成Restful风格接⼝⽂档的框架。
Swagger能成为最受欢迎的REST APIs⽂档⽣成⼯具之⼀,有以下⼏个原因:
Swagger 可以⽣成⼀个具有互动性的API控制台,开发者可以⽤来快速学习和尝试API。
Swagger 可以⽣成客户端SDK代码⽤于各种不同的平台上的实现。
Swagger ⽂件可以在许多不同的平台上从代码注释中⾃动⽣成。
Swagger 有⼀个强⼤的社区,⾥⾯有许多强悍的贡献者。
按照下述步骤操作,你就能在WebApi中使⽤Swagger,本⽂做测试⽤的版本v5.6.0,好好看吧,如果有可改进的地⽅,欢迎⼤家留⾔。
1、安装Swagger
2、初次运⾏
3、添加⾃定义ApiController
public class PleasureController : ApiController
{
/// <summary>
/// 获取完整的⽤户信息
/// </summary>
/// <param name="age">年龄</param>
/// <param name="name">姓名</param>
/// <returns>完整的⽤户信息</returns>
public string GetMessage(int age,string name)
{
return string.Format("age={0},name={1}", age, name);    }
}
4、添加实现了ISwaggerProvider接⼝的类
在App_Start⽂件夹中添加SwaggerControllerDescProvider.cs,相关代码如下:
namespace WebApiSwagger.Main.App_Start
{
/// <summary>
/// 显⽰swagger控制器的描述
/// </summary>
public class SwaggerControllerDescProvider : ISwaggerProvider
{
private readonly ISwaggerProvider _swaggerProvider;
private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();        private readonly string _xml;
/// <summary>
///
/// </summary>
/// <param name="swaggerProvider"></param>
/// <param name="xml">xml⽂档路径</param>
public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml)
{
_swaggerProvider = swaggerProvider;
_xml = xml;
}
public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
{
var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
SwaggerDocument srcDoc = null;js获取json的key和value
//只读取⼀次
if (!_cache.TryGetValue(cacheKey, out srcDoc))
if (!_cache.TryGetValue(cacheKey, out srcDoc))
{
srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
_cache.TryAdd(cacheKey, srcDoc);
}
return srcDoc;
}
/// <summary>
/// 从API⽂档中读取控制器描述
/// </summary>
/// <returns>所有控制器描述</returns>
public ConcurrentDictionary<string, string> GetControllerDesc()
{
string xmlpath = _xml;
ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
if (File.Exists(xmlpath))
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmlpath);
string type = string.Empty, path = string.Empty, controllerName = string.Empty;
string[] arrPath;
int length = -1, cCount = "Controller".Length;
XmlNode summaryNode = null;
foreach (XmlNode node in xmldoc.SelectNodes("//member"))
{
type = node.Attributes["name"].Value;
if (type.StartsWith("T:"))
{
//控制器
arrPath = type.Split('.');
length = arrPath.Length;
controllerName = arrPath[length - 1];
if (controllerName.EndsWith("Controller"))
{
//获取控制器注释
summaryNode = node.SelectSingleNode("summary");
string key = controllerName.Remove(controllerName.Length - cCount, cCount);
if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))                            {
controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
}
}
}
}
}
return controllerDescDict;
}
}
}
5、添加功能性js⽂件
在Scripts⽂件夹中添加SwaggerConfig.js脚本⽂件,将其设置为“嵌⼊的资源”。这个js⽂件的功能主要有两个:⼀个是,另⼀个是
在界⾯上显⽰控制器的描述⽂字。
'use strict';
window.SwaggerTranslator = {
_words: [],
translate: function () {
var $this = this;
$('[data-sw-translate]').each(function () {
$(this).html($this._tryTranslate($(this).html()));
$(this).val($this._tryTranslate($(this).val()));
$(this).attr('title', $this._tryTranslate($(this).attr('title')));
});
},
setControllerSummary: function () {
$.ajax({
type: "get",
async: true,
url: $("#input_baseUrl").val(),
dataType: "json",
success: function (data) {
var summaryDict = data.ControllerDesc;
var id, controllerName, strSummary;
$("#resources_container .resource").each(function (i, item) {
id = $(item).attr("id");
if (id) {
controllerName = id.substring(9);
strSummary = summaryDict[controllerName];
if (strSummary) {
$(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>')                        }
}
});
}
});
},
_tryTranslate: function (word) {
return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
},
learn: function (wordsMap) {
this._words = wordsMap;
}
};
/* jshint quotmark: double */
window.SwaggerTranslator.learn({
"Warning: Deprecated": "警告:已过时",
"Implementation Notes": "实现备注",
"Response Class": "响应类",
"Status": "状态",

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。