ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

asp.net web api中的版本管理

2022-02-04 08:31:45  阅读:148  来源: 互联网

标签:web asp api new using logger 2.0 public


  应用是演进的,通常我们用版本号来管理。api也是演进的,这篇博文就说说asp.net web api演进时的版本管理。

 

 

 

  asp.net web api的版本管理是通过微软的一个包来实现的。

 


  Install-Package Microsoft.AspNetCore.Mvc.Versioning


 

通过url参数: api/order/api-version=2.0

  在startup中注入ApiVersion

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddApiVersioning();
            services.AddControllers();
        }

  在ProductController中标注版本特性

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace APIVersionDemo.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    [ApiVersion("1.0", Deprecated = true)]
    [ApiVersion("2.0")]
    public class ProductController : ControllerBase
    {
        private readonly ILogger<ProductController> _logger;
        public ProductController(ILogger<ProductController> logger)
        {
            _logger = logger;
        }
        //1.0的api
        [HttpGet("{id}")]
        public Product QueryProduct([FromRoute] int id)
        {
            _logger.LogInformation("v1.0查询产品");
            return new Product() { ID = id, Name = "A物品", Price = 100.20m };
        }

        //2.0的api
        [HttpGet("{id}")]
        [MapToApiVersion("2.0")]
        public Product QueryProductv2([FromRoute] int id)
        {
            _logger.LogInformation("v2.0查询产品");
            return new Product2() { ID = id, Name = "A物品", Price = 100.20m, Description = "产自山西" };
        }   
    }
    /// <summary>
    /// 1.0的产品类
    /// </summary>
    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
    /// <summary>
    /// 2.0的产品类
    /// </summary>
    public class Product2 : Product
    {
        public string Description { get; set; }
    }
}

  通过http://localhost:5000/api/product/1?api-version=2.0方式访问不同的版本。显而易见,这种通过在请求url末尾加参数的方式有点啰嗦。

 

  通过MediaType:{Accept:application/json;version=2.0}或header:{version:2.0}

  修改startup的apiversion注入参数

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddApiVersioning(opt =>
            {
                opt.AssumeDefaultVersionWhenUnspecified = true;
                opt.DefaultApiVersion = new ApiVersion(1, 0);
                opt.ApiVersionReader = ApiVersionReader.Combine(
                    new MediaTypeApiVersionReader("version"),
                    new HeaderApiVersionReader("api-version")
                    );
                opt.ReportApiVersions = true;
            });
            services.AddControllers();
        }

  ProductController不变。

  请求http://localhost:5000/api/product/1,header参数,可以适配两种方式:Accept  :  application/json;version=2.0api-version  :  2.0
  这样方便客户端请求的整体处理。

 

通过url:api/v2.0/order

  strartup.cs注入apiversion

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddApiVersioning();
            services.AddControllers();
        }

  这里引入OrderController,在Route特性上改变url,在url里增加版本信息{version:apiVersion}

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace APIVersionDemo.Controllers
{
    [ApiController]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiVersion("1.0", Deprecated = true)]
    [ApiVersion("2.0")]
    public class OrderController : ControllerBase
    {
        private readonly ILogger<OrderController> _logger;
        public OrderController(ILogger<OrderController> logger)
        {
            _logger = logger;
        }
        //v1订单api
        [HttpGet("{id}")]
        public Order QueryOrder()
        {
            _logger.LogInformation("v1查询产品");
            return new Order()
            {
                OrderID = 1,
                Products = new List<Product>()
                {
                    new Product() { ID = 1, Name = "A物品", Price = 100.20m }
                }
            };
        }
       //v2订单api
        [HttpGet("{id}")]
        [MapToApiVersion("2.0")]
        public Order2 QueryOrder2()
        {
            _logger.LogInformation("v2查询产品");
            return new Order2()
            {
                OrderID = 1,
                Products = new List<Product2>()
                {
                new Product2() { ID = 1, Name = "A物品", Price = 100.20m, Description = "产自山西" }
                }
            };
        }
    }
   //v1订单类
    public class Order
    {
        public int OrderID { get; set; }
        public List<Product> Products { get; set; }
    }
    //v2订单类
    public class Order2
    {
        public int OrderID { get; set; }
        public List<Product2> Products { get; set; }
    }
}

  这时请求就变成http://localhost:5000/api/v2.0/order了,可以通过不同的url来访问不同的api版本,这种方式也有利于客户端统一配置baseurl,来切换请求api版本。

 

  最后,apiversion这个包还带来了一个无侵入controller的方式来配置api的版本,本质与加在Controller上的特性信息是一致的——附加版本信息和对应关系。

services.AddApiVersioning(opt =>
{              
       opt.Conventions.Controller<ProductController>()
          .HasApiVersion(2, 0)
          .HasDeprecatedApiVersion(1, 0)
          .Action(typeof(ProductController)
          .GetMethod(nameof(ProductController.QueryProductv2))!)
          .MapToApiVersion(2, 0);
});

 

  想要更快更方便的了解相关知识,可以关注微信公众号  

 

 

 

标签:web,asp,api,new,using,logger,2.0,public
来源: https://www.cnblogs.com/ljknlb/p/15862439.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有