
发布日期:2025-03-18 04:38 点击次数:70
Swagger 是一个要领且齐全的框架,用于生成、刻画、调用和可视化 RESTful 作风的 Web 事业。 Swagger 的见解是对 REST API 界说一个圭臬且和言语无关的接口,不错让东谈主和计较机领有不消拜谒源码、文档或网罗流量监测就不错发现和相识事业的才智。当通过 Swagger 进行正确界说,用户不错相识辛勤事业并使用最少已毕逻辑与辛勤事业进行交互。与为底层编程所已毕的接口访佛,Swagger 扬弃了调用事业时可能会有的预计。 Swagger 的上风 扶植 API 自动生成同步的在线文档:使用 Swagger 后不错径直通过代码生成文档,不再需要我方手动编写接口文档了,对体式员来说极端便捷,不错从简写文档的时分去学习新技巧。 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还扶植在线测试。参数和体式齐定好了王二小电影,径直在界面上输入参数对应的值即可在线测试接口。
在C#怎样装配Swagger1.掀开VS软件找到器具
图片王二小电影
然后输入Swagger图片
然后找到Swashbuckle并装配图片
装配了之后再找到Swagger.NET.UI并装配图片
2.装配好了之后会在App_Start下生成一个SwaggerConfig的类,咱们找到这个类并掀开图片
找到时势Register修改并替换图片
12色吧 XML这里填写成我方的图片
找到这个类并防御图片
现时基本上就大功获胜了!!! 动手技俩输入http://localhost:51462/swagger/ 就不错了图片
这里有几个坑要把稳一下,不要剿袭SwaggerUI底下的index动手这么也会报错, 需要我方输入生成的地址http://localhost:我方的端标语/swagger/就不错了 这么完成了之后可是 咱们时势莫得防御,不扶植防御奈何办呢图片
找到App_Start文献夹并创建SwaggerCacheProvider辅助类public class SwaggerCacheProvider : ISwaggerProvider { private readonly ISwaggerProvider _swaggerProvider; private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>(); private readonly string _xmlPath; /// <summary> /// /// </summary> /// <param name='swaggerProvider'></param> /// <param name='xmlpath'>xml文档旅途</param> public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath) { _swaggerProvider = swaggerProvider; _xmlPath = xmlpath; } public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) { var cacheKey = string.Format('{0}_{1}', rootUrl, apiVersion); //只读取一次 if (!_cache.TryGetValue(cacheKey, out SwaggerDocument 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() { ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>(); if (File.Exists(_xmlPath)) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(_xmlPath); string[] arrPath; int cCount = 'Controller'.Length; foreach (XmlNode node in xmldoc.SelectNodes('//member')) { string type = node.Attributes['name'].Value; if (type.StartsWith('T:')) { arrPath = type.Split('.'); string controllerName = arrPath[arrPath.Length - 1]; if (controllerName.EndsWith('Controller')) //截至器 { //赢得截至器防御 XmlNode 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; } }
这个类的大致预料即是找到咱们之前生成的XML并加载然后找到咱们添加的防御实质并生成对应参数复返给前台 是以咱们还需要添加一个js
图片
找到文献夹Scripts添加swagger的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': '气象', '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': '从旅途', 'server returned': '事业器复返' }); $(function () { window.SwaggerTranslator.translate(); window.SwaggerTranslator.setControllerSummary(); });
这里的js添加完成把稳小数这里要设成镶嵌资源
图片
成立完成之后,咱们下一步笃定要注册这个资源,于是咱们又要回到之前的SwaggerConfig上头
public static void Register() { //var thisAssembly = typeof(SwaggerConfig).Assembly; 赢得技俩文献旅途 //var baseDirectory = AppDomain.CurrentDomain.BaseDirectory + @'\App_Data\'; //var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + '.XML'; //var commentsFile = Path.Combine(baseDirectory, commentsFileName); GlobalConfiguration.Configuration .EnableSwagger(c => { //用于启用和成立Swagger的建立信息。 c.SingleApiVersion('v2', '测试 API 接口文档'); c.IncludeXmlComments($@'{System.AppDomain.CurrentDomain.BaseDirectory}\bin\TestSwaggerList.xml'); //赢得技俩指定旅途下xml文献 c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, $@'{System.AppDomain.CurrentDomain.BaseDirectory}\bin\TestSwaggerList.xml')); }) .EnableSwaggerUi(c => { //用于启用UI界面上的东西。 //加载汉化的js文献,把稳 swagger.js文献属性必须成立为“镶嵌的资源”。 APIUI.Scripts.swagger.js次序是:技俩称呼->文献夹->js文献名 c.InjectJavaScript(Assembly.GetExecutingAssembly(), 'TestSwaggerList.Scripts.swagger.js'); }); }
图片
现时咱们就去时势写个防御试试吧图片
然后动手技俩图片
这么就算大功获胜了,虽然内部有可能有其他非凡非常莫得贬责,比如多个时势同名奈何办????但愿行家一谈共享一同朝上,谢谢行家 demo下载地址:swagger 本站仅提供存储事业,所有这个词实质均由用户发布,如发现存害或侵权实质,请点击举报。