Swagger (OpenAPI) 是一個與語言無關的規范,用于描述 REST API, 它使計算機和用戶無需直接訪問源代碼即可了解 REST API 的功能,即你無論是用C#,java還是python構建REST API,你的檔案規范都是一樣的,
我們可以根據檔案生成我們的api客戶端代碼,當然自己搞也可以,但是花費時間比較多,網上找了下,有以下幾種方式:
1.NSwagStudio
2.NSwag.CodeGeneration.CSharp 或 NSwag.CodeGeneration.TypeScript NuGet 包 - 用于在專案中生成代碼,
3.通過命令列使用 NSwag,
4.NSwag.MSBuild NuGet 包,
5.Unchase OpenAPI (Swagger) Connected Service(Unchase OpenAPI (Swagger) 連接服務):一種 Visual Studio 連接服務,用于在 C# 或 TypeScript 中生成 API 客戶端代碼, 還可以使用 NSwag 為 OpenAPI 服務生成 C# 控制器,
6.AutoRest
7.swagger-codegen
對比了這幾種方式,發現很多都是生成單個cs檔案,有部分有模板(swagger-codegen是用java實作的,還沒研究),最終覺得NSwagStudio和NSwag.CodeGeneration.CSharp比較好用,
所以簡單的研究了一下使用方式,NSwagStudio目前只能生成單個檔案,可以自定義模板,算是比較好用,
若參考NSwag.CodeGeneration.CSharp包自己進行編程,可實作生成多個檔案,鑒于網上資料比較少,檔案也不詳細,這里簡單寫一下代碼和使用方式
1.默認實作方式,單個cs檔案生成
System.Net.WebClient wclient = new System.Net.WebClient();
var document = await OpenApiDocument.FromJsonAsync(wclient.DownloadString("Https://SwaggerSpecificationURL.json"));
wclient.Dispose();
var settings = new CSharpClientGeneratorSettings
{
ClassName = "MyClass",
CSharpGeneratorSettings =
{
Namespace = "MyNamespace"
}
};
var generator = new CSharpClientGenerator(document, settings);
var code = generator.GenerateFile();
2.多個cs檔案生成,根據多個控制器生成多個cs客戶端代碼,多個請求和回傳值型別也實作多個檔案的輸出
-首先定義一個繼承類把方法開放出來
public class MultiCSharpClientGenerator : CSharpClientGenerator { public MultiCSharpClientGenerator(OpenApiDocument document, CSharpClientGeneratorSettings settings) : base(document, settings) { } public MultiCSharpClientGenerator(OpenApiDocument document, CSharpClientGeneratorSettings settings, CSharpTypeResolver resolver) : base(document, settings, resolver) { } /// <summary> /// 獲取請求和回傳值物體型別代碼集合 /// </summary> /// <returns></returns> public new IEnumerable<CodeArtifact> GenerateDtoTypes() { return base.GenerateDtoTypes(); } /// <summary> /// 獲取客戶端代碼集合 /// </summary> /// <returns></returns> public new IEnumerable<CodeArtifact> GenerateAllClientTypes() { return base.GenerateAllClientTypes(); } }
-批量生成代碼檔案
class Program
{
static async void Main(string[] args)
{
System.Net.WebClient wclient = new System.Net.WebClient();
var document =await OpenApiDocument.FromJsonAsync(wclient.DownloadString("Https://SwaggerSpecificationURL.json"));
wclient.Dispose();
var settings = new CSharpClientGeneratorSettings
{
CSharpGeneratorSettings =
{
Namespace = "MyNamespace"
},
//設定模板路徑
CodeGeneratorSettings=
{
TemplateDirectory="E:\\nswag\\CustomTemplates",
},
//設定多個控制器客戶端代碼生成
OperationNameGenerator=new MultipleClientsFromFirstTagAndOperationIdGenerator()
};
var generator2 = new MultiCSharpClientGenerator(document, settings);
//生成物體類檔案
foreach (var t in generator2.GenerateDtoTypes())
{
WriteMyTypeToFile(t.TypeName, t.Code);
}
//生成客戶端類檔案
foreach (var t in generator2.GenerateAllClientTypes())
{
WriteMyTypeToFile(t.TypeName, t.Code);
}
Console.WriteLine("代碼生成完成");
Console.ReadLine();
}
/// <summary>
/// 創建檔案
/// </summary>
/// <param name="name"></param>
/// <param name="code"></param>
private static void WriteMyTypeToFile(string name,string code)
{
string path = @"D:\TestNSwag";
if (!Directory.Exists(path))
{
DirectoryInfo di = Directory.CreateDirectory(path);
}
var filepath = Path.Combine(path, $"{name}.cs");
using (StreamWriter writer = File.CreateText(filepath))
{
writer.Write(code);
}
}
}
代碼有點簡陋,后期需要優化,其中TypeName是型別名稱,Code是代碼,生成檔案的時候可以根據自己的需要做修改,
模板可以從NSwag上獲取,可以自己修改,使用的是liquid型別的檔案
有一個問題還無法解決,就是泛型型別生成的檔案有點問題,貌似還沒得到解決,這里貼一下討論的鏈接
如有其他實作方式和建議請留言
參考資料:NSwag,aspnetcore官方檔案,OpenAPI規范 ......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285721.html
標籤:其他
上一篇:easy-flows原始碼研習
