1. 程式人生 > >ASP.NET WebAPI使用Swagger生成測試文檔

ASP.NET WebAPI使用Swagger生成測試文檔

domain lease resources 警告 term model trim tno star

ASP.NET WebAPI使用Swagger生成測試文檔

SwaggerUI是一個簡單的Restful API測試和文檔工具。簡單、漂亮、易用(官方demo)。通過讀取JSON配置顯示API .項目本身僅僅也只依賴一些html,css,js靜態文件.你可以幾乎放在任何Web容器上使用

搗鼓了好久最終效果如下

1、API控制器和action描述

技術分享圖片

技術分享圖片

2、測試接口

技術分享圖片

技術分享圖片

使用swagger

1.創建webapi項目解決方案

2.引用swagger nuget包

swashbuckle和swagger.NET

技術分享圖片

技術分享圖片

刪除多余的SwaggerUI文件夾和配置類SwaggerNet

3、添加接口註釋

接下來可以訪問http://xxxx/swagger 這樣並看不到註釋

項目屬性->勾選生成xml文檔文件

技術分享圖片

技術分享圖片

修改SwaggerConfig文件

技術分享圖片

c.IncludeXmlComments(string.Format(@"{0}\App_Data\Api.xml",AppDomain.CurrentDomain.BaseDirectory));

技術分享圖片

漢化

1.SwaggerConfig

技術分享圖片

技術分享圖片

js文件需要嵌入到dll

技術分享圖片

技術分享圖片

/// <summary>
/// 中文轉換
/// </summary>
var SwaggerTranslator = (function () {
//定時執行檢測是否轉換成中文,最多執行500次 即500*50/1000=25s
var iexcute = 0,
//中文語言包
_words = {
"Warning: Deprecated": "警告:已過時",
"Implementation Notes": "實現備註",
"Response Class": "響應類",
"Status": "狀態",
"Parameters": "參數",
"Parameter": "參數",
"Value": "值",
"Description": "描述",
"Parameter Type": "參數類型",
"Data Type": "數據類型",
"Response Messages": "響應消息",
"HTTP Status Code": "HTTP狀態碼",
"Reason": "原因",
"Response Model": "響應模型",
"Request URL": "請求URL",
"Response Body": "響應體",
"Response Code": "響應碼",
"Response Headers": "響應頭",
"Hide Response": "隱藏響應",
"Headers": "頭",
"Try it out!": "試一下!",
"Show/Hide": "顯示/隱藏",
"List Operations": "顯示操作",
"Expand Operations": "展開操作",
"Raw": "原始",
"can‘t parse JSON. Raw result": "無法解析JSON. 原始結果",
"Model Schema": "模型架構",
"Model": "模型",
"apply": "應用",
"Username": "用戶名",
"Password": "密碼",
"Terms of service": "服務條款",
"Created by": "創建者",
"See more at": "查看更多:",
"Contact the developer": "聯系開發者",
"api version": "api版本",
"Response Content Type": "響應Content Type",
"fetching resource": "正在獲取資源",
"fetching resource list": "正在獲取資源列表",
"Explore": "瀏覽",
"Show Swagger Petstore Example Apis": "顯示 Swagger Petstore 示例 Apis",
"Can‘t read from server. It may not have the appropriate access-control-origin settings.": "無法從服務器讀取。可能沒有正確設置access-control-origin。",
"Please specify the protocol for": "請指定協議:",
"Can‘t read swagger JSON from": "無法讀取swagger JSON於",
"Finished Loading Resource Information. Rendering Swagger UI": "已加載資源信息。正在渲染Swagger UI",
"Unable to read api": "無法讀取api",
"from path": "從路徑",
"Click to set as parameter value": "點擊設置參數",
"server returned": "服務器返回"
},

//定時執行轉換
_translator2Cn = function () {
if ($("#resources_container .resource").length > 0) {
_tryTranslate();
}

if ($("#explore").text() == "Explore" && iexcute < 500) {
iexcute++;
setTimeout(_translator2Cn, 50);
}
},

//設置控制器註釋
_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").prepend(‘<li class="controller-summary" title="‘ + strSummary + ‘">‘ + strSummary + ‘</li>‘);
}
}
});
}
});
},

//嘗試將英文轉換成中文
_tryTranslate = function () {
$(‘[data-sw-translate]‘).each(function () {
$(this).html(_getLangDesc($(this).html()));
$(this).val(_getLangDesc($(this).val()));
$(this).attr(‘title‘, _getLangDesc($(this).attr(‘title‘)));
});
},
_getLangDesc = function (word) {
return _words[$.trim(word)] !== undefined ? _words[$.trim(word)] : word;
};

return {
Translator: function () {
document.title = "API描述文檔";
$(‘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>‘);
$("#logo").html("接口描述").attr("href", "/Home/Index");
//設置控制器描述
_setControllerSummary();
_translator2Cn();
}
}
})();
//執行轉換
SwaggerTranslator.Translator();

2.控制器描述和接口文檔緩存

public class CachingSwaggerProvider : ISwaggerProvider
{
private static ConcurrentDictionary<string, SwaggerDocument> _cache =
new ConcurrentDictionary<string, SwaggerDocument>();

private readonly ISwaggerProvider _swaggerProvider;

public CachingSwaggerProvider(ISwaggerProvider swaggerProvider)
{
_swaggerProvider = swaggerProvider;
}

public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
{
var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
SwaggerDocument srcDoc = null;
//只讀取一次
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 static ConcurrentDictionary<string, string> GetControllerDesc()
{
string xmlpath = string.Format(@"{0}\App_Data\Api.xml", System.AppDomain.CurrentDomain.BaseDirectory);
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;
}
}

有什麽問題大家可以在下面評論,本人技術不怎麽到位,寫的不好希望大家見諒。

ASP.NET WebAPI使用Swagger生成測試文檔