webapi版本控制

一、为什么要使用版本控制

(1)项目不停迭代,在增加新接口时不破坏原有接口,以保证webapi推出新功能后旧的移动客户端可顺利使用老接口

(2)限制移动端对接口的访问,为客户端提供额外的功能。

二、webapi版本控制方法

(1)在 URL 中追加版本或作为查询字符串参数

(2)通过自定义标头和通过接受标头

三、webapi版本控制实现

微软有开源的组件库,不用重复造轮子,aspnet-api-versioning

四、swagger查看各个版本的webapi

1.如何使用swagger来查看webapi文档,请参阅我的另一篇文章

swagger集成

2.如何查看不同版本有哪些接口,效果如下

我的版本控制方法基于Header实现,使用的是asp.net mvc,主要的代码已加粗

Startup.cs

public class Startup
    {
        public static string VersionName = "api-version";
        /// <summary>
        /// Configures the application using the provided builder.
        /// </summary>
        /// <param name="builder">The current application builder.</param>
        public void Configuration( IAppBuilder builder )
        {
            // we only need to change the default constraint resolver for services that want urls with versioning like: ~/v{version}/{controller}
            var constraintResolver = new DefaultInlineConstraintResolver() { ConstraintMap = { ["apiVersion"] = typeof( ApiVersionRouteConstraint ) } };
            var configuration = new HttpConfiguration();
            var httpServer = new HttpServer( configuration );

            // reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
            configuration.AddApiVersioning( o => {
                o.ReportApiVersions = true;
                //采用header方式控制版本
                o.ApiVersionReader = new HeaderApiVersionReader(Startup.VersionName);
            } );
            configuration.MapHttpAttributeRoutes( constraintResolver );
            //集成swagger
            var apiExplorer = configuration.AddVersionedApiExplorer( o => o.GroupNameFormat = "‘v‘VVV" );
            configuration.EnableSwagger(
                            "{apiVersion}/swagger",
                            swagger =>
                            {
                                //多版本选择配置
                                swagger.MultipleApiVersions(
                                    ( apiDescription, version ) => apiDescription.GetGroupName() == version,
                                    info =>
                                    {
                                        foreach ( var group in apiExplorer.ApiDescriptions )
                                        {
                                            var description = "A sample application with Swagger, Swashbuckle, and API versioning.";

                                            if ( group.IsDeprecated )
                                            {
                                                description += " This API version has been deprecated.";
                                            }

                                            info.Version(group.Name, $"webapi文档 {group.ApiVersion}");
                                        }
                                    } );
                                //调试时添加版本参数
                                swagger.DocumentFilter<ReplaceQueryVersionFilter>();
                                //为版本参数设置默认值
                                swagger.OperationFilter<SwaggerDefaultValuesFilter>();
                                //载入xml
                                string xmlFile = XmlCommentsFilePath;
                                swagger.IncludeXmlComments(xmlFile);
                            } )
                         .EnableSwaggerUi( swagger => {
                             swagger.EnableDiscoveryUrlSelector();
                         });

            builder.UseWebApi( httpServer );
        }

        static string XmlCommentsFilePath
        {
            get
            {
                var basePath = System.AppDomain.CurrentDomain.RelativeSearchPath;
                var fileName = typeof( Startup ).GetTypeInfo().Assembly.GetName().Name + ".xml";
                return Path.Combine( basePath, fileName );
            }
        }

ReplaceQueryVersionFilter.cs

 /// <summary>
    /// 将query中的版本号参数更换为head请求方式
    /// </summary>
    public class ReplaceQueryVersionFilter : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            foreach (PathItem path in swaggerDoc.paths.Values)
            {
                var versionParam = path.get.parameters.FirstOrDefault(i => i.name == Startup.VersionName);
                if (versionParam != null)
                {
                    var index = path.get.parameters.IndexOf(versionParam);
                    path.get.parameters[index][email protected] = "header";
                }
            }
        }
    }

SwaggerDefaultValuesFilter.cs

public class SwaggerDefaultValuesFilter : IOperationFilter
    {
        /// <summary>
        /// Applies the filter to the specified operation using the given context.
        /// </summary>
        /// <param name="operation">The operation to apply the filter to.</param>
        /// <param name="schemaRegistry">The API schema registry.</param>
        /// <param name="apiDescription">The API description being filtered.</param>
        public void Apply( Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription )
        {
            if ( operation.parameters == null )
            {
                return;
            }

            foreach ( var parameter in operation.parameters )
            {
                try
                {
                    var description = apiDescription.ParameterDescriptions.First(p => p.Name == parameter.name);

                    // REF: https://github.com/domaindrivendev/Swashbuckle/issues/1101
                    if (parameter.description == null)
                    {
                        parameter.description = description.Documentation;
                    }

                    // REF: https://github.com/domaindrivendev/Swashbuckle/issues/1089
                    // REF: https://github.com/domaindrivendev/Swashbuckle/pull/1090
                    if ([email protected] == null)
                    {
                        [email protected] = description.ParameterDescriptor.DefaultValue;
                    }
                }
                catch
                {

                }
            }
        }
    }
时间: 2024-11-09 01:59:37

webapi版本控制的相关文章

电商系统架构总结4(webapi 版本控制)

为了 顺利迭代升级,web api 在维护过程是不断升级的,但用户是不能强迫他们每次都跟随你去升级,这样会让用户不胜其烦.为了保证不同版本的客户端能同时兼容,在web api接口上加入版本控制就很有必要了. 当然,对于我们开发的代码进行版本控制也有利,不至于陷入混乱.版本参数可以放置在请求的url 作为路由参数的一部分,也可以放在header里.实现的办法是 实现 IHttpControllerSelector 并在WebApiConfig的注册方法里进行替换. public class Ver

ASP.Net Core WebApi几种版本控制对比

原文:ASP.Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或作为查询字符串参数, (2)通过自定义标头和通过接受标头 在这篇文章中, 让我们来看看如何支持多个版本的 ASP.NET  Core  Web API. 一.创建asp.net core webapi 项目,引用NuGet包:Ins

.NetCore WebApi —— Swagger版本控制

上接:.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) 版本控制的好处是显而易见的,利用Swagger展示不同版本的API更能体现效果. 1.安装Nuget包:Microsoft.AspNetCore.Mvc.Versioning 2. 配置Startup类  2.1  添加新成员 ,用来获取API版本信息 /// <summary> /// Api版本信息 /// </summary> private IApiVersionDescription

Web API 接口版本控制 SDammann.WebApi.Versioning

前言 在设计对外 Web API 时,实务上可能会有新旧版本 API 并存的情况,例如开放 Web API 给厂商串接,但同一个服务更新版本时,不一定所有厂商可以在同一时间都跟着更新他们的系统,但如果直接把服务修改成新的,这些厂商可能就无法跟你的服务串 接了,直到他们修成新版的程序代码,他们方能正常运作. 当这样的情况不被允许时,通常就会希望可以透过不同的 version 来呼叫「同一个 API 」,这里的同一个 API 包含了新旧版本的服务. 目前的环境是 .NET framework 4.0

WebApi路由及版本控制

public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey = "namespace"; private const string ControllerKey = "controller"; private readonly HttpConfiguration _configuration; private readonly L

WCF、WebAPI、WCFREST、WebService之间的区别【转】

转自:http://www.cnblogs.com/markli/p/4460564.html 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对Web Service.WCF以及Web API的看法. Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用

WCF、WebAPI、WCF REST、Web Service之间的区别

在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对Web Service.WCF以及Web API的看法. Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用 4.它只能部署在IIS上 WCF 1.这个也是基于SOAP的,数据格式是XML 2.这个是We

WebApi深入学习--特性路由

特性路由 WebApi2默认的路由规则我们称作基于约定路由,很多时候我们使用RESTful风格的URI.简单的路由是没问题的,如 api/Products/{id},但有些事很难处理的,如资源之间存在嵌套关系:客户包含订单,书有作者属性等等.对于这种Uri,我们希望的路由是这样的:/costomers/{customerid}/orders 或 /costomers/{customerid}/orders/{orderid} 考虑到这只是某个Controller的路由格式,而我们会有很多个Con

WebAPI 和 WebService的区别

webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级.webapi支持如get,post等http操作 http soap关系 http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接.HTTP服务器则在那个端口监听客户端发送过来的请求.