.NET webAPI中集成swagger

 最近做的项目使用winform三层+webapi,对于webAPI路由文档管理一直觉得单独做一些管理比较麻烦,并且测试的时候项目内的代码测试运行起来也比较麻烦,所以在网上开始检索相关办法,发现热度比较高的两种:

1.微软 HelpPage   2.swagger

      第二种方案虽然官网文档比较难找,但是有很多实例,所以开始研究第二种,给大家看看效果:

API控制器总览

action和描述

直观的接口测试

 

使用swagger

  1.创建webapi项目解决方案

  2.引用swagger nuget包

  Swashbuckle、Swagger.Net.UI(如果不需要调整在线测试页面可以不添加)两个包

  3.卸载重复包Swagger.Net

  引用Swagger.Net.UI时会引用Swagger.Net这个包,但是Swagger.Net的功能和Swashbuckle重复了。所以我采取了卸载Swagger.Net

 

 4.添加接口注释

完成上面三部运行项目,可以看到接口描述已经生成,浏览地址http://xxx/Swagger。但是没有接口的注释,下面添加接口注释

 项目属性->勾选生成xml文档文件

修改SwaggerConfig文件

        private static string GetXmlCommentsPath()
        {
           return System.String.Format(@"{0}\bin\WebApi.XML", System.AppDomain.CurrentDomain.BaseDirectory);
        }

 以上两者必须保持一致

winform通过Swagger生成的本地XML读取路由

1.在action注释的地方加上路径

2.把webAPI项目内生成的XML文档拷贝到winform项目的基路径

3.XML读取action路径方法:

        /// <summary>
        /// WebAPI路由方法文件
        /// </summary>
        public static string Path
        {
            get {
                string _path = AppDomain.CurrentDomain.BaseDirectory + "WebAPI.xml";
                return _path;
                }
        }

        /// <summary>
        /// 查询XML节点
        /// </summary>
        /// <param name="functionname"></param>
        /// <returns></returns>
        public static CONFIG_FUNCTION ReadNodeXML(string functionname)
        {
            try
            {
                string controllerName;
                CONFIG_FUNCTION model = new CONFIG_FUNCTION();
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(Path);
                XmlNodeList nodeList1 = xmlDoc.SelectSingleNode("doc").ChildNodes;//获取Controllers节点的所有子节点 members
                XmlNodeList nodeList = nodeList1[1].SelectNodes("member");
                foreach (XmlNode xn in nodeList)//遍历所有子节点 
                {
                    XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 
                    string name= xe.GetAttribute("name").ToString();
                    if (name.Contains("Controller.") && name.Contains("("))
                    {
                        controllerName = name.Substring(name.IndexOf("Controller.") + 11, (name.IndexOf("(") - name.IndexOf("Controller.") - 11));
                        if (controllerName == functionname)
                        {
                            model.FUNCTIONNAME = controllerName;
                            XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 
                            foreach (XmlNode xn1 in nls)//遍历 
                            {
                                XmlElement xe2 = (XmlElement)xn1;//转换类型 
                                if (xe2.Name == "url")//如果找到
                                    model.FUNCTIONPATH = xe2.InnerText;
                            }
                        }
                    }
                }
                return model;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

  

总结

  有了这么方便的接口描述文档和接口测试工具,让前后端分离开发更加方便了,测试也可以不依赖于界面单独测试接口。

posted @ 2018-02-01 16:37  T丶MELO  阅读(295)  评论(0编辑  收藏  举报