强类型客户端 Web API 生成器直接从 ASP.NET (Core) Web API 生成 C# 和 TypeScript 客户端 API 代码,无需涉及 Swagger/OpenAPI 或 Swashbuckle,因此最大限度地支持 ASP.NET Web API 的 Code First 方法的数据类型。
产品
该项目提供以下产品:
- 支持 .NET 和 Xamarin.Forms 的 C# 强类型客户端 API 代码生成器。
- 适用于 jQuery、Angular 2+、Aurelia、Axios 和 Fetch API 的 TypeScript 中强类型客户端 API 的代码生成器。
- TypeScript CodeDOM,TypeScript 的 .NET CodeDOM 组件,用于开发 TypeScript 代码生成器。
- POCO2TS.exe,一个从 POCO 类生成 TypeScript 接口的命令行程序。
- Fonlow.Poco2Ts,一个从 POCO 类生成 TypeScript 接口的组件。
- 适用于 jQuery、AXIOS、Fetch API、Aurelia、Angular 2+ 以及 Angular Typed Reactive Forms 的插件。
- Fonlow.DataOnlyExtensions 带有 JSON 转换器,用于处理位于不同时区的客户端和服务器之间的仅日期场景。 .NET Framework 包也可用。
使用案例和下载
产品主要通过 NuGet 发布。
- 生成 C# 客户端 API,然后使用包 Fonlow.WebApiClientGenCore
- 生成 TypeScript 客户端 API,然后使用 Fonlow.WebApiClientGenCore 的插件之一:
- jQuery 和 HttpClient 帮助程序库
- 角度 6+
- Angular 6+,加上带有描述的反应式表单的 FormGroup 创建
- AXIOS
- 奥雷利亚
- 获取API
- 通过CodeDOM方法开发TypeScript代码生成器,然后使用包Fonlow.TypeScriptCodeDOMCore。
- 通过 CodeDOM 方法为 POCO 等开发 TypeScript 代码生成器,然后使用包 Fonlow.Poco2TSCore 或使用 PowerShell 7 脚本。
- 生成 TypeScript 类型接口,然后使用 Poco2TSCore.exe(一个控制台应用程序)。
- 开发读取 .NET 程序集的 XML 文档的功能,然后使用包 Fonlow.DocCommentCore。
提示:
- OpenApiClientGen 基于 WebApiClientGen 的关键组件,是一个衍生产品,用于根据 Swagger/Open API 规范的定义文件生成 C# 和 TypeScript 客户端 API 代码。
- WebApiClientGen 不使用 Swagger / OpenAPI 定义,而是从调试版本的正在运行的 Web API 的运行时类型信息生成代码,摆脱了 OpenAPI 针对 .NET 类型和 Web API 的固有限制,为 ASP 提供更好的开发人员体验。 NET(核心)Web API 开发人员。
评论:
- 开发始于 2015 年,支持 .NET Framework,然后支持 .NET Core 2。标签“LastCore31”是标记支持 .NET Framework 4.6.2 和 .NET Core 3.1 的最后一个快照。
- 从2021年2月10日开始,开发将仅支持.NET 5及更高版本。
- 关于 .NET Framework 的 Wiki 内容将在可预见的将来保留。
主要特点
- 生成的客户端 API 代码直接从 Web API 控制器方法、.NET 基元类型和 POCO 类映射。这与 WCF 中的 svcutil.exe 提供的类似。
- 复制控制器方法和 POCO 类的文档注释。
- 一些验证属性用于为 TypeScript 代码生成文档注释。
开发者体验的主要优势
- WebApiClientGen 与 ASP.NET Core Web API 无缝集成,在 RAD 或敏捷软件开发期间,只需很少的步骤/开销即可在 Web API 和客户端 API 之间进行设置、维护和同步。
- 支持所有 .NET 基元类型,包括十进制。
- 支持DataTime、DataTimeOffset、DateOnly、Array、Tuple、Dynamic Object、Dictionary和KeyValuePair
- 强类型生成的代码需要接受设计时类型检查和编译时类型检查。
- 提供高层次的抽象,使应用程序开发人员免受 RESTful 实践的重复技术细节和 AJAX 调用的传统代码的影响。
- 包括文档注释在内的丰富元信息使 IDE 智能感知更加有用,因此应用程序开发人员无需阅读单独的 API 文档。
- 基于 .NET 验证属性生成的文档注释。
- 基于数字类型、DateOnly 和 TypeScript 代码的 GUID 生成文档注释。
- 生成的 TypeScript 代码符合 TypeScript 严格模式,生成的 Angular 2+ 代码符合 Angular 严格模式。
示例
- POCO 类
- 网络应用程序接口
- 生成的客户端 API C# 代码
- 使用 C# 生成的库的客户端代码
- 在 TypeScript 中为 jQuery、Angular 2、Aurelia 和 Axios 生成客户端数据模型和 API
- 使用 TypeScript 中生成的库的客户端代码
- GitHub.IO 中托管的 Angular Heroes 在线演示与真实后端对话
评论:
- 从生成的 TypeScript 代码编译而来的 JavaScript 代码可以在 JS 应用程序中使用,但是,显然没有可用的类型信息,而应用程序程序员可能仍然喜欢从 AJAX 细节中进行智能感知和抽象。
- React 和 Vue.js 应用程序通常使用 Axios 或 Fetch API 进行 HTTP 请求。自 2019 年 6 月以来,由于此拉取请求,babel 已经支持命名空间,因此您应该能够使用生成的 TypeScript 代码进行 React TSX 编程。
概念
- Web API 供应商/开发人员应该像 Google 和 Amazon 等那样向客户端程序的开发人员提供客户端 API 库,以便使 RESTful Web API 有效地接触到更广泛的消费者(内部和外部)。
- 对于客户端开发者来说,像
ReturnType DoSomething(Type1 t1, Type2 t2 ...)
这样的经典函数原型就是 API 函数,剩下的就是传输的技术实现细节:TCP/IP、HTTP、SOAP、面向资源、CRUD——基于URI、RESTful、XML和JSON等。函数原型和一份API文档应该足以调用API函数。 - Web API 设计中的关注点分离得越好,您就越能从该项目的组件中受益,从而更快地交付业务价值,同时减少手工代码、重复性任务和人为错误的可能性。
预期的编程实践
强类型函数原型
ReturnType DoSomething(Type1 t1, Type2 t2 ...)
[ HttpGet ]
[ Route ( "getPerson/{id}" ) ]
public Person GetPerson ( long id )
通过中间件进行模型验证
您不需要编写验证请求有效负载的显式代码,而是使用中间件进行验证。例如:
public void ConfigureServices ( IServiceCollection services )
{
services . AddControllers (
options =>
{
options . Filters . Add ( new ValidateModelAttribute ( ) ) ; // wholesale style to check model binding for all API calls.
参考:
- ASP.NET Web API 中的模型验证
- ASP.NET Core MVC 和 Razor 页面中的模型验证
通过 ApiControllerAttribute 进行模型验证
例如:
[ ApiController ]
[ Route ( "api/[controller]" ) ]
public class HeroesController : ControllerBase
{
由中间件处理的非 2xx HTTP 状态代码,可选
即使您在 API 函数中显式编写代码来处理异常并返回非 2xx HTTP 状态代码,您也应该有一个安全网来捕获未捕获的异常并返回 HTTP 状态代码。
参考:
先决条件
服务器端:
- .NET 7/8
- 添加 CodeGenController。
- 在服务启动代码中添加以下内容:
services . AddControllers (
options =>
{
#if DEBUG
options . Conventions . Add ( new Fonlow . CodeDom . Web . ApiExplorerVisibilityEnabledConvention ( ) ) ;
#endif
}
)
评论:
- 微软自2016年以来每年都会发布.NET(Core)的重大升级,该存储库中的库一般会在半年后发布最新版本。
- 公共库的 .NET 版本比最新版本低一个版本,而 ASP.NET 演示应用程序和带有生成的 .NET 客户端 API 的集成测试套件则使用当前版本的 .NET。
.NET 客户端:
- .NET Framework 4.5.2、通用 Windows、Mono.Android、Xamarin.iOS、.NET Core 2.0/2.1/3 和 .NET 5
- ASP.NET Web API 2.2 客户端库
- Newtonsoft 的 Json.NET for Content-Type application/json
- 微软构建工具 2015
NewtonSoft.Json 或 System.Text.Json
从 .NET 7 开始,为了序列化,System.Text.Json 重新组装了超过 95% 的 NewtonSoft.Json。只有少数复杂 POCO 结构的边缘情况是 System.Text.Json 无法处理的。
WebApiClientGen 同时支持服务器端和 C# 客户端。对于 C# 客户端,您可以在代码生成设置中使用“UseSystemTextJson”。
不过,如果您的应用程序涉及复杂的 POCO 结构,那么从 .NET 7 开始,使用 NewtonSoft.Json 是一个安全的选择。
TypeScript 客户端:
- TypeScript 编译器
- jQuery
- 角度 2-17
- 奥雷利亚
- 阿克西奥斯
- 获取API
欲了解更多详情,请查看:
- 维基百科
- 设置说明
- 为 ASP.NET Web API 生成 C# .NET 客户端 API
- 为 ASP.NET Web API 生成 TypeScript 客户端 API
- ASP.NET Web API、Angular2、TypeScript 和 WebApiClientGen
- 为 ASP.NET Core Web API 生成 C# 客户端 API
- 强类型 OpenAPI 客户端生成器的有意限制的预期解决方案。本文仅以 OpenApiClientGen 为例,其中的原理和解决方案可以应用于 WebApiClientGen 为您的客户端应用程序生成的代码。
- ASP.NET Core 6 中的 DateOnly
演示应用程序
该存储库中的演示应用程序主要用于在开发过程中测试WebApiClientGen。以下存储库中还有其他演示应用程序,演示了现实世界的应用程序如何利用 WebApiClientGen:
- 适用于 .NET Framework、.NET Standard、Xamarin 和 vue TS 的 WebApiClientGen 示例。
- 适用于 ASP.NET Core MVC、Web API、ASP.NET Core + Angular、MAUI、fetchAPI、vue TS 和 React TS 的 .NET Core 演示。
- WebApiClientGen 与 Swagger
这些演示应用程序得到积极维护并与最新框架保持同步。如果您仍然使用一些较旧的框架,例如 Angular 4 或 5 或 .NET Core 2.0,您可以导航到存储库的相应标签并结账。
英雄之旅
Tour of Heroes 是官方 Angular 教程演示应用程序。
为了说明程序员使用 WebApiClientGen 的体验,以下演示应用程序采用类似的架构设计,在各种开发框架或库上具有相同的功能特性,但与真实的后端通信。
- Angular 2+ 和类型化反应形式
- Xamarin
- 毛伊岛。从 Xamarin Heroes 迁移。
- 奥蕾莉亚.包括集成测试套件。
- 反应。包括集成测试套件。
- Blazor 独立版
NewtonSoft.Json 或 System.Text.Json
然而,虽然 WebApiClientGen 两者都支持,但自 2024 年以来主要支持已转向 System.Text.Json。
NewtonSoft.Json 在某些场景和上下文中仍然具有一些优势:
- 如果您有很多由 DataContractAttributes 修饰的 POCO 类,因为支持遗留应用程序,或者支持 XML 和 JSON 序列化,NewtonSoft.Json 为您提供固有的支持,而 System.Text.Json 自 .NET 7 以来提供了一些麻烦的和间接的支持。
- 对于某些数组类型和动态,NewtonSoft.Json 还是更好。