前言

先看这 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. [oeasy]python0072_自定义小动物变色_cowsay_color_boxes_asciiart

    修改颜色 回忆上次内容 上次搞的是 颜色 前景颜色 总共有 7 种基本色 还有什么 好玩的 么? 可以 给小动物 上色 吗? 配合 先将cowsay结果 输出重定向 sudo apt install ...

  2. C# 开发技巧 轻松监控方法执行耗时

    前言 MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间.允许你在不修改代码的情况下,自动地测量和记录方法的执行时间. 这个工具是基于.NET的 ...

  3. python语言版(代码):计算百分数的概率单位

    相关资料: [转载]百分数的概率单位变换--解惑:概率确实没有单位但是数学里面确实有"概率单位"这个词 百分比与概率单位对照表 https://www.docin.com/p-22 ...

  4. C# Cefsharp 设置代理方法

    前提条件 为了实现在cefsharp里面设置代理,首先在创建一个ChromiumWebBrowser的时候,检查是否使用了以下代码 settings.CefCommandLineArgs.Add(&q ...

  5. Kotlin 布尔值教程:深入理解与应用示例

    Kotlin 布尔值 在编程中,您经常需要一种只能有两个值的数据类型,例如: 是 / 否 开 / 关 真 / 假 为此,Kotlin 有一种布尔数据类型,可以取 true 或 false 值. 布尔值 ...

  6. 8月5日CSP-S模拟赛赛后总结

    8月5日CSP-S模拟赛赛后总结 \[8月5日 \ \ CSP-S模拟赛 \ \ 赛后总结 \\ 2024年8月5日 \\ by \ \ \ uhw177po \] 一.做题情况 第一题比赛 \(10 ...

  7. Apache DolphinScheduler 社区5月月报更新!

    各位热爱 DolphinScheduler 的小伙伴们,社区5月份月报更新啦!这里将记录 DolphinScheduler 社区每月的重要更新,欢迎关注,期待下个月你也登上Merge Star月度榜单 ...

  8. localAI: 编译步骤说明

    懒人通道 官网提供了懒人包,使用的时候不需要关注整个打包流程,,下面是官方的cuda示例,当然官方提供可选项很多,Available: cublas, openblas, clblas, metal, ...

  9. SMU Summer 2024 Contest Round 3

    SMU Summer 2024 Contest Round 3 寻找素数对 题意 给你一个偶数,找到两个最接近的素数,其和等于该偶数. 思路 处理出 1e5 以内的素数,然后遍历,更新最接近的答案. ...

  10. 《重学Java设计模式》笔记——建造者模式

    1. 建造者模式可以解决什么问题 我家里有各种形状的瓷器,盘子或者碗.虽然形状不同,但是所用的材料基本上是一样的,比如土.水.釉.彩这些基本的东西. 但是做不同款式的瓷器,方法是不同的.假如说我现在已 ...