经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
基于NSwag.CodeGeneration.CSharp生成Swagger/OpenAPI客户端C#代码
来源:cnblogs  作者:ldybyz  时间:2021/5/24 10:41:38  对本文有异议

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文件生成

  1. System.Net.WebClient wclient = new System.Net.WebClient();
  2.  
  3. var document = await OpenApiDocument.FromJsonAsync(wclient.DownloadString("Https://SwaggerSpecificationURL.json"));
  4.  
  5. wclient.Dispose();
  6.  
  7. var settings = new CSharpClientGeneratorSettings
  8. {
  9. ClassName = "MyClass",
  10. CSharpGeneratorSettings =
  11. {
  12. Namespace = "MyNamespace"
  13. }
  14. };
  15.  
  16. var generator = new CSharpClientGenerator(document, settings);
  17. var code = generator.GenerateFile();

  

2.多个cs文件生成,根据多个控制器生成多个cs客户端代码,多个请求和返回值类型也实现多个文件的输出

-首先定义一个继承类把方法开放出来

  1. public class MultiCSharpClientGenerator : CSharpClientGenerator
  2. {
  3. public MultiCSharpClientGenerator(OpenApiDocument document, CSharpClientGeneratorSettings settings) : base(document, settings)
  4. {
  5. }
  6. public MultiCSharpClientGenerator(OpenApiDocument document, CSharpClientGeneratorSettings settings, CSharpTypeResolver resolver) : base(document, settings, resolver)
  7. {
  8. }
  9. /// <summary>
  10. /// 获取请求和返回值实体类型代码集合
  11. /// </summary>
  12. /// <returns></returns>
  13. public new IEnumerable<CodeArtifact> GenerateDtoTypes()
  14. {
  15. return base.GenerateDtoTypes();
  16. }
  17. /// <summary>
  18. /// 获取客户端代码集合
  19. /// </summary>
  20. /// <returns></returns>
  21. public new IEnumerable<CodeArtifact> GenerateAllClientTypes()
  22. {
  23. return base.GenerateAllClientTypes();
  24. }
  25. }

 

-批量生成代码文件

  1. class Program
  2. {
  3. static async void Main(string[] args)
  4. {
  5. System.Net.WebClient wclient = new System.Net.WebClient();
  6. var document =await OpenApiDocument.FromJsonAsync(wclient.DownloadString("Https://SwaggerSpecificationURL.json"));
  7. wclient.Dispose();
  8.  
  9. var settings = new CSharpClientGeneratorSettings
  10. {
  11. CSharpGeneratorSettings =
  12. {
  13. Namespace = "MyNamespace"
  14. },
  15. //设置模板路径
  16. CodeGeneratorSettings=
  17. {
  18. TemplateDirectory="E:\\nswag\\CustomTemplates",
  19. },
  20. //设置多个控制器客户端代码生成
  21. OperationNameGenerator=new MultipleClientsFromFirstTagAndOperationIdGenerator()
  22.  
  23.  
  24. };
  25.  
  26. var generator2 = new MultiCSharpClientGenerator(document, settings);
  27.  
  28. //生成实体类文件
  29. foreach (var t in generator2.GenerateDtoTypes())
  30. {
  31. WriteMyTypeToFile(t.TypeName, t.Code);
  32. }
  33. //生成客户端类文件
  34. foreach (var t in generator2.GenerateAllClientTypes())
  35. {
  36. WriteMyTypeToFile(t.TypeName, t.Code);
  37. }
  38.  
  39. Console.WriteLine("代码生成完成");
  40. Console.ReadLine();
  41.  
  42. }
  43.  
  44. /// <summary>
  45. /// 创建文件
  46. /// </summary>
  47. /// <param name="name"></param>
  48. /// <param name="code"></param>
  49. private static void WriteMyTypeToFile(string name,string code)
  50. {
  51. string path = @"D:\TestNSwag";
  52. if (!Directory.Exists(path))
  53. {
  54. DirectoryInfo di = Directory.CreateDirectory(path);
  55.  
  56. }
  57. var filepath = Path.Combine(path, $"{name}.cs");
  58.  
  59. using (StreamWriter writer = File.CreateText(filepath))
  60. {
  61. writer.Write(code);
  62. }
  63. }
  64. }

 

代码有点简陋,后期需要优化,其中TypeName是类型名称,Code是代码,生成文件的时候可以根据自己的需要做修改。

模板可以从NSwag上获取,可以自己修改,使用的是liquid类型的文件

有一个问题还无法解决,就是泛型类型生成的文件有点问题,貌似还没得到解决,这里贴一下讨论的链接

如有其他实现方式和建议请留言

 

 

参考资料:NSwagaspnetcore官方文档OpenAPI规范 ......

 

原文链接:http://www.cnblogs.com/ldybyz/p/14790891.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号