ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

swagger-codegen 生成的 C 客户端 Order 模型详解:从 Swagger 定义到源码与实战使用

swagger-codegen 生成的 C 客户端 Order 模型详解:从 Swagger 定义到源码与实战使用 开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载导读本文围绕 swagger-codegen 生成的 C# 客户端样例中IO.Swagger.Model.Order模型文档展开完整剖析 Order 模型的六个属性及其类型映射、可空性标记、枚举状态与默认值并深入对应的 OpenAPI 定义petstorefake.yaml与生成源码Order.cs最后通过StoreApi的PlaceOrder/GetOrderById演示如何在真实业务中创建、序列化与反序列化订单对象。读完本文你将掌握如何阅读这类模型文档、理解生成代码背后的类型映射规则并能直接在项目中使用该模型类。Order 模型文档全景模型文档 Order.md 是 swagger-codegen 为 C# 客户端自动生成的模型说明以属性表格的形式列出模型的全部字段。Order 表示宠物商店中的一笔订单其属性如下属性名类型描述备注Idlong?订单 IDoptionalPetIdlong?宠物 IDoptionalQuantityint?数量optionalShipDateDateTime?发货时间optionalStatusstring订单状态Order StatusoptionalCompletebool?是否完成optional默认false注意表格中所有类型均为可空类型以?结尾这并非巧合而是 swagger-codegen 对 optional非必填属性生成的约定只要 OpenAPI 定义中属性不是 required生成的 C# 属性就是NullableT。这一点在生成源码中体现得十分明显下文会展开说明。文档末尾还附有三条导航链接[[Back to Model list]](../README.md#documentation-for-models)返回模型列表指向 README.md[[Back to API list]](../README.md#documentation-for-api-endpoints)返回 API 列表[[Back to README]](../README.md)返回客户端使用说明这类导航是每个模型文档页的固定组成部分便于在生成的数十个模型文件之间快速跳转同一目录下还有 Pet.md、User.md、Category.md 等模型文档。模型定义的源头OpenAPI 规范中的 OrderOrder 模型并不是凭空生成的它源自 swagger-codegen 仓库的测试规格文件 petstorefake.yaml 中的definitions段。原始定义如下definitions: Order: type: object properties: id: type: integer format: int64 petId: type: integer format: int64 quantity: type: integer format: int32 shipDate: type: string format: date-time status: type: string description: Order Status enum: - placed - approved - delivered complete: type: boolean default: false xml: name: Order将规范定义与生成的模型文档逐字段对照可以看到 swagger-codegen 的类型映射规则OpenAPI 定义C# 类型说明type: integer, format: int64long?64 位整数type: integer, format: int32int?32 位整数type: string, format: date-timeDateTime?日期时间type: stringenumstring枚举生成StatusEnumtype: booleandefault: falsebool?默认false布尔类型带默认值其中status的description: Order Status被原样带入了生成的 XML 注释和模型文档的描述列complete的default: false则体现在文档备注列与构造函数逻辑中。这说明模型文档表格的每一列都能在 OpenAPI 定义中找到对应依据阅读文档即可反推服务端的数据契约。从 YAML 到 C#Order.cs 源码逐段解析生成的模型类位于 Order.cs命名空间IO.Swagger.Model对应模板为 model.mustache。下面分段解读其核心结构。类声明与枚举[DataContract] public partial class Order : IEquatableOrder, IValidatableObject { [JsonConverter(typeof(StringEnumConverter))] public enum StatusEnum { [EnumMember(Value placed)] Placed 1, [EnumMember(Value approved)] Approved 2, [EnumMember(Value delivered)] Delivered 3 }StatusEnum是 swagger-codegen 针对 OpenAPI 中status字段的enum列表自动生成的强类型枚举三个成员placed、approved、delivered与 YAML 定义一一对应。StringEnumConverter与EnumMember(Value ...)的配合使枚举在 JSON 序列化时输出为原始字符串值如placed而非整数保证与服务端数据契约完全一致。类声明中的三个接口/特性同样由模板固定生成[DataContract]支持 WCF 风格的数据契约IEquatableOrder提供强类型相等比较IValidatableObject支持System.ComponentModel.DataAnnotations校验框架。构造函数与默认值处理public Order(long? id default(long?), long? petId default(long?), int? quantity default(int?), DateTime? shipDate default(DateTime?), StatusEnum? status default(StatusEnum?), bool? complete false) { this.Id id; this.PetId petId; this.Quantity quantity; this.ShipDate shipDate; this.Status status; // use default value if no complete provided if (complete null) { this.Complete false; } else { this.Complete complete; } }构造函数为每个属性提供了可选参数其中complete的默认值false正是从 YAML 中default: false自动提取的。代码特意做了complete null的空值兜底即使调用方显式传入nullComplete也会回退为false与文档中 [default to false] 的备注完全对应。属性声明与序列化[DataMember(Nameid, EmitDefaultValuefalse)] public long? Id { get; set; } [DataMember(NamepetId, EmitDefaultValuefalse)] public long? PetId { get; set; } [DataMember(Namequantity, EmitDefaultValuefalse)] public int? Quantity { get; set; } [DataMember(NameshipDate, EmitDefaultValuefalse)] public DateTime? ShipDate { get; set; } [DataMember(Namestatus, EmitDefaultValuefalse)] public StatusEnum? Status { get; set; } [DataMember(Namecomplete, EmitDefaultValuefalse)] public bool? Complete { get; set; }DataMember特性中的Name指定了 JSON 字段名与 YAML 属性名一致EmitDefaultValuefalse表示值为 null 的属性在 JSON 输出时会被省略避免无意义的id: null。ToString()与ToJson()方法分别提供可读文本与格式化 JSON 输出public override string ToString() { ... } public virtual string ToJson() { return JsonConvert.SerializeObject(this, Formatting.Indented); }ToJson()基于 Newtonsoft.Json 的JsonConvert.SerializeObject实现可直接用于调试打印或手动构造请求体。此外Equals/GetHashCode按字段逐个比较null 安全保证集合去重与对象相等性判断可用。一个典型的 Order JSON 实例综合以上规则一个完整的 Order 对象序列化后的 JSON 大致如下{ id: 1, petId: 1, quantity: 1, shipDate: 2020-09-01T10:30:00Z, status: placed, complete: false }字段名与 YAML 属性名完全一致status输出枚举字符串complete在显式设为false时仍会输出因为非 null只有未赋值的可空属性才会因EmitDefaultValuefalse被省略。在 StoreApi 中使用 Order下订单与查订单Order 模型的主要业务入口是StoreApi对应文档 StoreApi.md实现位于 StoreApi.cs。与 Order 相关的端点有两个方法HTTP 请求说明PlaceOrder(Order body)POST /store/order为宠物下订单请求体为 Order返回 OrderGetOrderById(long? orderId)GET /store/order/{order_id}按 ID 查询订单返回 Order下订单PlaceOrdervar apiInstance new StoreApi(); var body new Order( id: 1, petId: 1, quantity: 2, shipDate: DateTime.UtcNow, status: Order.StatusEnum.Placed, complete: false ); Order result apiInstance.PlaceOrder(body); Debug.WriteLine(result);从源码 StoreApi.cs 可以看到底层调用链校验必填参数body为 null 时抛出ApiException(400, Missing required parameter body ...)确定请求路径/store/order并声明Accept: application/xml, application/json响应头通过Configuration.ApiClient.Serialize(body)将 Order 对象序列化为请求体再调用CallApi发起POST响应通过ApiClient.Deserialize(localVarResponse, typeof(Order))反序列化回Order类型返回。因此 Order 同时承担了请求体序列化与响应体反序列化两种角色这得益于类中DataMember/StringEnumConverter等特性在双向转换中的一致性。查订单GetOrderByIdvar apiInstance new StoreApi(); var orderId 789L; Order result apiInstance.GetOrderById(orderId); Debug.WriteLine(result.Status); // 输出枚举 Debug.WriteLine(result.Complete); // 输出 bool?GetOrderById的返回值直接反序列化为Order见 StoreApi.cs调用方可以通过result.Status、result.Complete等强类型属性访问订单状态与完成标记无需手动解析 JSON。文档还提示有效的测试 ID 应满足 5或 10其他值会触发异常这正是宠物商店测试接口的约定。多目标框架下的 Order 变体swagger-codegen 的 C# 生成器支持多种目标框架仓库样例目录samples/client/petstore/csharp/下存在六个变体每个都包含一份独立的 Order 模型实现目录目标框架SwaggerClient默认 .NET Framework 客户端SwaggerClientNet35.NET Framework 3.5SwaggerClientNet40.NET Framework 4.0SwaggerClientNetCoreProject.NET Core 项目SwaggerClientNetStandard.NET Standard 类库SwaggerClientWithPropertyChanged启用属性变更通知INotifyPropertyChanged的变体这些变体的模型源码结构基本一致差别主要在于WithPropertyChanged变体会额外生成OnXxxChanged回调与属性通知代码用于 MVVM 绑定场景。实际使用时应根据目标运行时选择对应的 NuGet 包或直接引用相应源码工程。如何基于 swagger-codegen 重新生成 Order 模型如果你希望在自己的项目中重新生成包含 Order 在内的整套 C# 客户端可以使用 swagger-codegen 的 CLI以仓库自带的 petstorefake.yaml 或你自己的 OpenAPI 定义为输入java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ -i fixtures/immutable/specifications/v2/petstorefake.yaml \ -l csharp \ -o samples/client/petstore/csharp/SwaggerClient其中-i指定 OpenAPI/Swagger 定义文件-l csharp选择 C# 生成器-o指定输出目录。生成后将得到src/IO.Swagger/Model/Order.cs、src/IO.Swagger/Api/StoreApi.cs以及docs/Order.md等完整客户端代码与文档。注意仓库中的 samples 是只读的生成产物实际项目应在独立目录中生成并纳入版本管理。小结本文以 Order.md 为线索完成了从文档 → 规范 → 源码 → 实战的完整闭环文档表格中每个属性都能回溯到 petstorefake.yaml 的定义类型、描述、默认值一一对应生成代码 Order.cs 通过DataMember、StringEnumConverter、可空类型与构造函数默认值精确承载了数据契约在 StoreApi.cs 中Order 作为请求体与响应体被Serialize/Deserialize双向使用直接可用。对于使用 swagger-codegen 生成 C# 客户端的开发者而言理解这类模型文档及其背后的生成规则可以让你在拿到生成产物后快速定位字段含义、判断类型映射是否符合预期并在业务代码中放心地强类型操作模型对象。赞分享开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载相关推荐swagger-codegen 生成 C 客户端中的 Order 模型从 OpenAPI 定义到 .NET 4.0 实体类swagger codegen 生成 C 客户端中的 Order 模型从 OpenAPI 定义到 .NET 4.0 实体类 Order 模型是 swagger开发工具代码生成API设计swagger-codegen 生成的 C 客户端模型 Order从 OpenAPI 定义到 .NET Standard 实现深度解析swagger codegen 生成的 C 客户端模型 Order从 OpenAPI 定义到 .NET Standard 实现深度解析 在 swagger c开发工具代码生成API设计swagger-codegen 生成的 Android Volley 客户端 Order 模型深度解析从 OpenAPI 定义到 Java 源码swagger codegen 生成的 Android Volley 客户端 Order 模型深度解析从 OpenAPI 定义到 Java 源码 导读 本文以开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表