網(wǎng)站首頁 編程語言 正文
需求
API接口版本管理,對于一些規(guī)模稍大的企業(yè)應(yīng)用來說,是經(jīng)常需要關(guān)注的一大需求。盡管我們的示例程序TodoList很簡單,但是我們也可以通過這個應(yīng)用程序,來實踐一下如何管理API接口版本。
目標(biāo)
實現(xiàn)API接口版本管理。
原理與思路
要實現(xiàn)API版本管理,我們需要這個庫:Microsoft.AspNetCore.Mvc.Versioning。它提供了.NET Web項目接口的版本管理功能。
實現(xiàn)
添加Nuget Package并配置服務(wù)
向Api項目中添加Microsoft.AspNetCore.Mvc.Versioning包。并添加一個擴(kuò)展方法:
ApiServiceExtensions.cs
using Microsoft.AspNetCore.Mvc; namespace TodoList.Api.Extensions; public static class ApiServiceExtensions { public static void ConfigureApiVersioning(this IServiceCollection services) { services.AddApiVersioning(options => { // 向響應(yīng)頭中添加API版本信息 options.ReportApiVersions = true; // 如果客戶端不顯式指定API版本,則使用默認(rèn)版本 options.AssumeDefaultVersionWhenUnspecified = true; // 配置默認(rèn)版本為1.0 options.DefaultApiVersion = new ApiVersion(1, 0); }); } }
在Program中調(diào)用:
Program.cs
// 省略其他... builder.ConfigureLog(); builder.Services.ConfigureApiVersioning();
實現(xiàn)API版本控制
方法1: 添加ApiVersion屬性
我們復(fù)制一份TodoItemController到新文件TodoItemV2Controller并修改類名和構(gòu)造函數(shù),其他保持原樣。為了給Controller標(biāo)記對應(yīng)的API版本號,我們分別向兩個Controller上添加屬性:
[ApiVersion("2.0")] [Route("/todo-item")] [ApiController] public class TodoItemV2Controller : ControllerBase { private readonly IMediator _mediator; // 省略其他... }
以及
[ApiVersion("1.0")] [Route("/todo-item")] [ApiController] public class TodoItemController : ControllerBase { private readonly IMediator _mediator; // 省略其他.. }
驗證1: 請求中不添加任何API版本相關(guān)字段
啟動Api項目,執(zhí)行查詢TodoItem的請求:
請求
-** 響應(yīng)**
日志輸出:
結(jié)果返回:
以及響應(yīng)頭信息中包含的api-supported-versions
:
驗證2: 請求中添加查詢字符串api-version
啟動Api
項目,執(zhí)行查詢TodoItem
的請求:
請求
響應(yīng)
日志輸出:
結(jié)果返回(可以自己嘗試修改內(nèi)部邏輯,這里我懶了沒改實現(xiàn),不過從日志已經(jīng)能看出請求確實進(jìn)入了V2版本的Controller):
以及響應(yīng)頭信息中包含的api-supported-versions
方法2: 通過請求頭攜帶API版本信息
為了實現(xiàn)這一點,需要在ConfigureApiVersioning
中增加配置:
ApiServiceExtensions.cs
// 省略其他... // 指定請求頭中攜帶用于指定API版本信息的字段 options.ApiVersionReader = new HeaderApiVersionReader("api-version");
驗證3: 通過請求頭攜帶API版本信息
啟動Api
項目,執(zhí)行查詢TodoItem
的請求:
請求
響應(yīng)日志輸出:
返回結(jié)果就不繼續(xù)貼了,以及響應(yīng)頭信息中包含的api-supported-versions
方法3: 通過URL路徑訪問對應(yīng)的版本
除了這種之外的以上幾種方法,都不需要修改接口的URI,而這種方式需要修改URI路徑。我們在兩個Controller上修改URI如下:
[ApiVersion("2.0")] [Route("/{v:apiVersion}/todo-item")] [ApiController] // 省略其他...
驗證4: 通過URI路徑選擇API版本
啟動Api
項目,執(zhí)行查詢TodoItem
的請求:
請求
響應(yīng)日志輸出:
返回結(jié)果就不繼續(xù)貼了,以及響應(yīng)頭信息中包含的api-supported-versions
:
一點擴(kuò)展
有的時候我們需要標(biāo)記一個版本的請求為deprecated
,但是還不想完全刪除這個Controller,可以用下面的方式進(jìn)行標(biāo)記,這樣返回頭中會指出這個版本的API已經(jīng)處于deprecated
狀態(tài)了。
[ApiVersion("2.0", Deprecated = true)] [Route("/{v:apiVersion}/todo-item")] [ApiController] // 省略其他...
或者在ConfigureApiVersioning
中使用Convention進(jìn)行標(biāo)記:
// 省略其他... // 使用Convention標(biāo)記deprecated options.Conventions.Controller<TodoItemV2Controller>().HasDeprecatedApiVersion(new ApiVersion(2, 0));
我們再請求2.0版本的API時,仍然可以獲取數(shù)據(jù),但是得到的返回頭中信息如下:
對比使用Convention方式標(biāo)記的返回頭
總結(jié)
在本文中我們使用多種方式實現(xiàn)了管理API版本的需求,可以根據(jù)具體的需要選擇一種進(jìn)行實現(xiàn)。
原文鏈接:https://www.cnblogs.com/code4nothing/p/15751046.html
相關(guān)推薦
- 2022-08-21 Electron+React進(jìn)行通信的方法_React
- 2022-12-05 關(guān)于EF的Code?First的使用以及踩坑記錄_實用技巧
- 2022-05-14 Centos8安裝docker報錯(錯誤提示:All?mirrors?were?tried)的問題_
- 2023-07-26 TypeScript中的聯(lián)合類型、類型別名、接口、類型斷言
- 2022-03-18 C#?利用Autofac批量接口注入依賴的問題小結(jié)_C#教程
- 2023-05-24 Golang實現(xiàn)AES對稱加密算法實例詳解_Golang
- 2022-04-15 Go語言io?pipe源碼分析詳情_Golang
- 2022-08-04 react項目優(yōu)化配置的操作詳解_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支