最近在工作上遇到要更新API的需求,但又要維持舊版API的向下相容性,
在WebAPI的設計與開發的文章中提到了API版本管理
就來使用Swagger來實作API版本管理吧!
安裝Swagger與設定產生程式註解XML
首先要從nuget上安裝Swagger套件
安裝完成後,會在App_Start\
有一個SwaggerCofig.cs
的檔案,這個檔案是用來設定Swagger的
接著設定專案產出程式註解的XML文件,在專案按右鍵的屬性
,選擇建置
,在輸出
的區塊,勾選XML文件檔案
,我預設是產出到App_Data\
的路徑
接下來回到SwaggerConfig.cs
檔案,尋找GetXmlCommentsPath()
這個Method,把它解開註解然後實作這個method,這個method是用來指定我們剛剛上面所設定的程式註解XML路徑,這樣swagger才有辦法產出畫面與說明
private static string GetXmlCommentsPath()
{
return AppDomain.CurrentDomain.BaseDirectory + "\\App_Data\\" + "SwaggerVersionExample.xml";
}
到這邊的設定都差不多結束了,基本的Swagger的功能就可以使用了
Swagger的預設路徑會在swagger/ui/index
,如果想要一打開站台就連到swagger首頁,可以在Route上設定,記得要擺在Route的第一個設定位置
config.Routes.MapHttpRoute(name: "SwaggerIndex",
routeTemplate: "",
defaults: null,
constraints: null,
handler: new RedirectHandler((message => message.RequestUri.ToString()), "swagger"));
建立不同版本號的Controller與設定swagger
我在Controller資料夾下建立不同版本號的Controller,要注意的是RoutePrefix
要帶入版本號資訊
接下來設定SwaggerConfig.cs
中,多版本號的支援
找到c.SingleApiVersion("v1", "SwaggerVersionExample");
並將它註解起來,同時找到MultipleApiVersions
區塊的相關程式碼,解開註解並實作ResolveVersionSupportByRouteConstraint
method,這個method是用來確認是否有多個版本的Controller
private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
{
return apiDesc.ActionDescriptor.ControllerDescriptor.ControllerType.FullName.Contains(targetApiVersion);
}
接著尋找EnableDiscoveryUrlSelector
這個method,並解開註解,這個是可以在swagger的介面上選擇版本
就來執行一下看成果吧
未來在增加新版本api的時候就可以與舊版本同時相容,使用api的開發者只要修改版本對應的route就可以使用不同版本的api了。
最後附上我實作的原始碼
範例程式