如何在不破坏现有集成的情况下在Web API响应有效负载结构中引入更改

问题描述

在我们现有的.net核心Web API(REST)端点之一中,其响应有效负载中的属性值之一是电子邮件地址,该地址不久将更改为字母数字ID。响应有效负载的这一变化将破坏现有的集成。

可以通过将版本引入api来解决此突破性更改影响,说版本2的响应有效载荷中只有v2版本会包含字母数字id,否则v1版本将在其响应有效载荷中保留呈现电子邮件地址,但是是否有其他替代解决方案可以避免破坏现有版本甚至在引入现有响应有效负载结构的更改之后也可以进行集成

现有响应有效负载结构:

{
  customerid: [email protected]
}

未来响应有效负载结构:

{
  customerid: 1123acbd56
}

解决方法

您可以通过创建AcceptHeaderAttribute并传递Accept:[attrbute value]

来实现此目的。

就像在下面的代码中,我创建一个AcceptHeaderAttribute

[AttributeUsage(AttributeTargets.Method)]
    public class AcceptHeaderAttribute : Attribute,IActionConstraint
    {
        private readonly string _acceptHeader;
        public AcceptHeaderAttribute(string acceptHeader)
        {
            _acceptHeader = acceptHeader;
        }
        public int Order { get; set; }

        public bool Accept(ActionConstraintContext context)
        {
            return context.RouteContext.HttpContext.Request.Headers["Accept"].Any(x => x.IndexOf(_acceptHeader) >= 0);
        }
    }

这是用途,

[HttpGet]
        public User GetUserName()
        {
            return new User { Name = "Abcd" };
        }

        [HttpGet]
        [AcceptHeader("app/vnd.user")]
        public User GetUserEmail()
        {
            return new User { Name = "[email protected]" };
        }

这是提琴手的回应

enter image description here