很好用的API管理--Swagger

 

1.打开NuGet程序包

2.安装下面两个程序包

 

3.安装完后会出现SwaggerConfig.cs类,并修改里面的内容

代码:

[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace WebApplication1
{
    public class SwaggerConfig
    {
        public static void Register()
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                {
                    c.SingleApiVersion("v1", "WebApp");

             c.IncludeXmlComments(GetXmlCommentsPath());

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

 

4.添加WebApi.cs类

代码:

namespace WebApi
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi1",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(
               name: "DefaultApi2",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { action="get",id = RouteParameter.Optional }
           );
        }
    }
}

 

5.修改Global.asax类

代码:

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configure(WebApiConfig.Register);   //这是要加的
        }
    }

 

6.设置需要调试的类

7.设置生成的XML文档

8.运行项目,打开浏览器输入http://localhost:23092/swagger/

结果展示:

 

 

注意:

在使用Swagger WebApi文档框架时,一个Controll中写多个Post接口时,在MVC4中会提示无法识别的多个post请求,原因是WebApiConfig中默认路由配置中是没有配置{action}引起的。

【在MVC5中没有此问题,原因是MVC5有Route[" "]特性,MVC4中不支持】

 

解决方案:

方法1:修改WebApiConfig文件

//默认配置  
           config.Routes.MapHttpRoute(  
               name: "DefaultApi",  
               routeTemplate: "api/{controller}/{id}",  
               defaults: new { id = RouteParameter.Optional }  
           );  
           //修改后配置  
           config.Routes.MapHttpRoute(  
               name: "DefaultApi",  
               routeTemplate: "api/{controller}/{action}/{id}",  
               defaults: new { id = RouteParameter.Optional }  
           );

方法2:MVC5中可以不修改默认配置文件,而使用Route特性来指定

/// <summary>
        /// POST请求1
        /// 
        ///api/Member
        /// </summary>
        /// <param name="value"></param>
        public void Post([FromBody]string value)
        {
 
        }
 
        /// <summary>
        /// POST请求2
        /// api/Member/Login
        /// </summary>
        /// <param name="loginId"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        [HttpPost, Route("api/Member/Login")]
        public string Login([FromBody]string loginId, [FromBody]string password)
        {
            return "";
        }

 

附带:隐藏接口

在使用Swagger需要隐藏不开放的API 
可以在SwaggerConfig.cs中加入

  /// <summary>  
        /// 隐藏接口,不生成到swagger文档展示  
        /// </summary>  
        [System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Class)]

        public partial class HiddenApiAttribute : System.Attribute { }
        public class HiddenApiFilter : IDocumentFilter
        {
            /// <summary>  
            /// 重写Apply方法,移除隐藏接口的生成  
            /// </summary>  
            /// <param name="swaggerDoc">swagger文档文件</param>  
            /// <param name="schemaRegistry"></param>  
            /// <param name="apiExplorer">api接口集合</param>  
            public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
            {
                foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions)
                {
                    if (Enumerable.OfType<HiddenApiAttribute>(apiDescription.GetControllerAndActionAttributes<HiddenApiAttribute>()).Any())
                    {
                        string key = "/" + apiDescription.RelativePath;
                        if (key.Contains("?"))
                        {
                            int idx = key.IndexOf("?", System.StringComparison.Ordinal);
                            key = key.Substring(0, idx);
                        }
                        swaggerDoc.paths.Remove(key);
                    }
                }
            }
        }

并且在SwaggerConfig.cs 中加入  

 c.DocumentFilter<HiddenApiFilter>();

搞定

 

posted @ 2017-10-19 08:58  你也很优秀  阅读(2898)  评论(0编辑  收藏  举报