前言

先看这 3 篇

ASP.NET Core – Web API Versioning

ASP.NET Core – Swagger OpenAPI (Swashbuckle)

ASP.NET Core – Swagger API Versioning

OData versioning 和普通 Web API versioning 大同小异,最大的区别是 EDM 是否换了。

主要参考

Docs – aspnet-api-versioning example(新的)

API versioning extension with ASP.NET Core OData 8(旧的)

Step by Step

安装 package

dotnet add package Microsoft.AspNetCore.OData
dotnet add package Asp.Versioning.Mvc
dotnet add package Asp.Versioning.OData

Product Model

namespace ODataVersioning;

public class Product1
{
public int Id { get; set; }
public string Name { get; set; } = "";
} public class Product2
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Age { get; set; }
}

有 2 个版本的 Product。

Product ModelConfiguration

public class ProductModelConfiguration : IModelConfiguration
{
private static void ConfigureV1(ODataModelBuilder builder)
{
builder.EntitySet<Product1>("products");
} private static void ConfigureV2(ODataModelBuilder builder)
{
builder.EntitySet<Product2>("products");
} public void Apply(ODataModelBuilder builder, ApiVersion apiVersion, string? routePrefix)
{
switch (apiVersion.MajorVersion)
{
case 1:
ConfigureV1(builder);
break;
case 2:
ConfigureV2(builder);
break;
default:
ConfigureV2(builder);
break;
}
}
}

ModelConfiguration 是让我们声明不同版本使用不同 EDM model 的地方。IModelConfiguration 可以有很多个,通常为了方便管理,一个 Entity 会有一个 IModelConfiguration。

Program.cs

首先是基本的 OData 配置,我们不在这里设置 EMD 了哦。

builder.Services.AddControllers().AddOData(
options => options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(null)
);

setup API versioning

var apiVersioningBuilder = builder.Services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
})
.AddMvc().AddOData(options => options.AddRouteComponents("api/v{version:apiVersion}"));

主要是加了 .AddOData 这一句,它会去查找所有的 IModelConfiguration 做 setup。

.AddMvc 不是必须的,因为我的 Controller 是 Web API 混搭 OData(odata 负责 get 而已)所以才需要。

注:Swagger 暂时不要放哦。

Product Controller

[ODataAttributeRouting]
[ApiController]
[ApiVersion("1.0", Deprecated = true)]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}")]
public class ProductController : ControllerBase
{
[EnableQuery]
[HttpGet("products"), MapToApiVersion("1.0")]
public IEnumerable<Product1> GetProducts_v1()
{
return _products_v1;
} [EnableQuery]
[HttpGet("products"), MapToApiVersion("2.0")]
public IEnumerable<Product2> GetProducts_v2()
{
return _products_v2;
} [EnableQuery]
[HttpGet("products/{id}"), MapToApiVersion("2.0")]
public ActionResult<Product2> GetProduct(int id)
{
return Ok(SingleResult.Create(_products_v2.AsQueryable().Where(e => e.Id == id)));
} [ODataIgnored]
[HttpPost("products"), MapToApiVersion("2.0")]
public ActionResult CreateProduct()
{
return CreatedAtAction(nameof(GetProduct), new { id = 3 }, new Product2 { Id = 3, Name = "p3", Age = 3 });
} public static readonly List<Product1> _products_v1 = [
new () { Id = 1, Name = "p1" },
new () { Id = 2, Name = "p2" }
]; public static readonly List<Product2> _products_v2 = [
new () { Id = 1, Name = "p1", Age = 1 },
new () { Id = 2, Name = "p2", Age = 2 }
];
}

和 API Versioning 没有太多的区别。唯一需要注意的是,Controller 一定要有 [ODataAttributeRouting],不然某些情况下 response 会变成普通的 Web API 而不是 OData。

具体细节和原因我懒得去查,我猜是 Bug,总之顺风水使用 [ODataAttributeRouting] + [ODataIgnored] 就对了。

测试

http://localhost:5298/api/v2.0/products
http://localhost:5298/api/v2.0/products/1
POST http://localhost:5298/api/v2.0/products

Swagger

OData 的 swagger 和普通 Web API 的 Swagger 配置差不多。查看这篇 ASP.NET Core – Swagger API Versioning

唯一的区别是需要安装

dotnet add package Asp.Versioning.OData.ApiExplorer

还有

就可以了。

OData – API Versioning的更多相关文章

  1. api.versioning 版本控制 自动识别最高版本

    Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅https://www.cnblogs.com/ ...

  2. api.versioning 版本控制 自动识别最高版本和多Area但同名Contoller问题解决办法

    Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅https://www.cnblogs.com/ ...

  3. web api 2 学习笔记 (OData Batch request)

    之前介绍过OData 中实现RPC的写法,今天在来一个批量操作. 参考 : https://damienbod.wordpress.com/2014/08/14/web-api-odata-v4-ba ...

  4. 用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...

  5. Restful Api 最佳实践

    Web APIs has become an very important topic in the last year. We at M-Way Solutions are working ever ...

  6. 让OData和NHibernate结合进行动态查询

    OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...

  7. 关于RESTFUL API 安全认证方式的一些总结

    常用认证方式 在之前的文章REST API 安全设计指南与使用 AngularJS & NodeJS 实现基于 token 的认证应用两篇文章中,[译]web权限验证方法说明中也详细介绍,一般 ...

  8. SharePoint 2013 REST 以及 OData 基础

    这篇文章会介绍: 简单的介绍REST,OData OData实现细节 OData在SharePoint 2013中的实现 为什么REST很重要 过去几年基于REST的webservice在IT企业越来 ...

  9. 【转】简单的 Laravel 5 REST API

    Introduction Almost all successful internet based companies have APIs. API is an acronym for Applica ...

  10. ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

随机推荐

  1. 权威技术社区InfoQ列网易数帆为年度最有价值技术团队,技术实力获广泛认可

    近日,权威技术社区InfoQ公布数字化转型技术服务商网易数帆为2020年最有价值技术团队,并被授予"最佳技术社区驱动力奖",认可网易数帆在技术领域的突出成就和实力.     Inf ...

  2. Profibus_DP转ModbusTCP网关模块接马保通讯案例

    某工业企业为了提高生产效率和管理水平,决定对其生产线进行智能化改造.在该项目中,利用巴图自动化Profibus_DP转ModbusTCP网关模块(BT-ETHPB20)连接了不同生产设备,实现了设备之 ...

  3. oeasy教您玩转vim - 25 - 更多颜色

    ​ 更多颜色 回忆上节课内容 我们上次深入了配色方案 定义了自己的配色方案 oeasy 建立了自己的配色 oeasy 在状态栏应用了自己的配色 ​ 明确能用的颜色 先胡乱地尝试一下修改颜色代码 hi ...

  4. 使用 useNuxtData 进行高效的数据获取与管理

    title: 使用 useNuxtData 进行高效的数据获取与管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入讲解 ...

  5. DUILib的代码分析

    1.思路上用的是mfc的Message_MAP,而Control只是一个gdi render. 控件间使用的Message Map. 也就是说每个控件可以作为一个独立的个体

  6. Python和RPA网页自动化-浏览器切换不同窗口页面

    以百度为例,点击[BOSS直聘]词条会打开一个BOSS新窗口页面,分别使用Python和RPA网页自动化在不同的窗口页面来回切换窗口完成以下顺序步骤 1.Python代码如下 步骤:打开新窗口页面后, ...

  7. web3 产品介绍: safe --多签钱包 多人审批更放心

    Safe是一款由Gnosis团队开发的多签钱包,它提供了一种安全.灵活和易于使用的方式来管理加密资产.在本文中,我们将介绍Safe的主要特点以及如何使用Safe来保护您的数字资产. 一.Safe的特点 ...

  8. 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计

    前言   电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来.  紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路.   ...

  9. 【ELK】Kibana-7.13.1版本 启动报错 Centos6

    报错信息: [root@centos6-1 gcc-4.8.2]# /opt/kibana-7.13.1-linux-x86_64/bin/kibana /opt/kibana-7.13.1-linu ...

  10. Asp.Net Core之Identity源码学习

    什么是Identity ASP.NET Identity是构建核心 Web 应用程序(ASP.NET.登录和用户数据)的成员系统.ASP.NET核心标识允许您向应用程序添加登录功能,并可以轻松自定义有 ...