简介:在nuget.org上,您可以找到 Microsoft.AspNetCore.Mvc.Versioning包,它提供了有关如何对Web API端点进行版本化的更多选项。这个包的好处是允许你直接在控制器上使用带参数的属性,因此使用起来非常方便。另一个好处 ...
在nuget.org上,您可以找到 Microsoft.AspNetCore.Mvc.Versioning包,它提供了有关如何对Web API端点进行版本化的更多选项。这个包的好处是允许你直接在控制器上使用带参数的属性,因此使用起来非常方便。另一个好处是您可以选择向客户端报告它不支持尝试调用的版本。在Startup.cs类中添加versionign服务时,只需启用此选项即可public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => o.ReportApiVersions = true); }如果您刚开始对API进行版本控制并且到目前为止还没有版本标识,那么您也可以设置默认版本控制。所有没有版本控制数据的请求 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1,0); }); } namespace Core.Versioning.Sample.Controllers{ [ApiVersion("1.0")] [Route("api/[controller]")] public class ValueController : Controller { [HttpGet] public String Get() { return "Version 1.0"; } }} namespace Core.Versioning.Sample.Controllers.v2{ [ApiVersion("2.0")] [ApiVersion("1.0", Deprecated = true)] [Route("api/[controller]")] public class ValueController : Controller { [HttpGet] public String Get() { return "Version 2.0"; } }} $ curl http:// localhost:5000 / api / value?api-version = 1.0 -i HTTP / 1.1 200 OK 日期:星期四,2018年6月14日08:11:13 GMT 内容类型:text / plain; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions:1.0,2.0 Version 1.0对于2.0版本,响应会有所不同 $ curl http:// localhost:5000 / api / value?api-version = 2.0 -i HTTP / 1.1 200 OK 日期:星期四,2018年6月14日08:11:19 GMT 内容类型:text / plain; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions:1.0,2.0现在我将尝试使用不受支持的3.0版调用API。让我们看看在这种情况下会发生什么 $ curl http:// localhost:5000 / api / value?api-version = 3.0 -i HTTP / 1.1 400 Bad Request Date:Thu,14 Jun 2018 08:16:12 GMT Content-Type:application / json; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions:1.0,2.0 { “error”:{ “code”:“UnsupportedApiVersion”, “message”:“与请求URI匹配的HTTP资源” http:// localhost:5000 / api / value?api-version = 3.0"不支持API版本"3.0"。“, ”innerError“:null } }您看到响应代码不是200 OK,但400 Bad Request with JSON消息表明此版本不受支持。基于标题的版本控制如果将版本作为查询字符串值发送到Web API端点不够好,则可以使用标头。对于这种版本控制方式,您需要在Startup.cs 文件中进行一些小的更改, 以告知版本控制包在特定键的标头中查找版本值。我选择使用与我用于api-version的查询字符串相同的方法 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1,0); o.ApiVersionReader = new HeaderApiVersionReader(“api-version”); }); } $ curl --header“api-version:2.0”http:// localhost:5000 / api / value -i HTTP / 1.1 200 OK 日期:星期四,2018年6月14日08:27:49 GMT 内容类型:text / plain ; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions:1.0,2.0 Version 2.0基于路由的版本控制基于路由的版本控制基于控制器的url结构,并期望路由包含版本。为此,我们需要将Startup.cs更改为不再从标题中读取,而是查看URL public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1,0); o.ApiVersionReader = new UrlSegmentApiVersionReader(); }); } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1, 0); o.ApiVersionReader = new HeaderApiVersionReader("api-version"); }); } services.AddApiVersioning( o => o.ApiVersionReader = ApiVersionReader.Combine( new QueryStringApiVersionReader(), new HeaderApiVersionReader() { Headers = { "api-version" } } ) ); $ curl --header“api-version:2.0”http:// localhost:5000 / api / value -i HTTP / 1.1 200 OK 日期:星期四,2018年6月14日08:27:49 GMT 内容类型:text / plain ; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions:1.0,2.0 Version 2.0基于路由的版本控制基于路由的版本控制基于控制器的url结构,并期望路由包含版本。为此,我们需要将Startup.cs更改为不再从标题中读取,而是查看URL public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1,0); o.ApiVersionReader = new UrlSegmentApiVersionReader(); }); } namespace Core.Versioning.Sample.Controllers{ [ApiVersion("1.0")] [ApiVersion("1.0", Deprecated = true)] [Route("api/[controller]")] [Route("api/v{version:apiVersion}/[controller]")] public class ValueController : Controller { [HttpGet] public String Get() { return "Version 1.0"; } }}namespace Core.Versioning.Sample.Controllers.v2{ [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] public class ValueController : Controller { [HttpGet] public String Get() { return "Version 2.0"; } }} $ curl http:// localhost:5000 / api / value -i HTTP / 1.1 200 OK 日期:星期四,2018年6月14日08:03:34 GMT 内容类型:text / plain; charset = utf-8 服务器:Kestrel Transfer-Encoding:chunked api-supported-versions: 1.0,2.0 api-deprecated-versions:1.0 Version 1.0您可能会注意到响应包含api-deprecated-vesion标头密钥设置为1.0。这是因为我们的新控制器具有以下属性 ApiVersion(“1.0”,Deprecated = true)这告诉Web API客户端不再支持1.0版。如果您的REST服务支持来自不同供应商的多个不同客户端,这可能非常有用。 好文要顶关注我收藏该文 作者:张子浩原文:https://www.cnblogs.com/ZaraNet/p/10175923.html |