开发工具代码生成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 仓库中 Javaokhttp-gson 库客户端示例的模型文档 Tag.md 为核心结合其背后的 OpenAPI 定义、生成的Tag.java源码、Pet模型关联与单元测试完整讲解一个 OpenAPI 数据模型是如何被 swagger-codegen 翻译为 Java 客户端模型类与 API 文档的完整链路。读完本文你将能读懂任意 swagger-codegen 生成的模型文档并能从字段类型、可选性标注一路回溯到 JSON 序列化与对象用法直接套用到自己的 API 客户端项目中。一、Tag 模型文档是什么samples/client/petstore/java/okhttp-gson/docs/目录下存放的是 swagger-codegen 为 Petstore 示例生成的Java API 客户端模型文档其中 Tag.md 描述的是名为Tag标签的数据模型。这类文档不是手工编写的而是代码生成器在生成客户端源码的同时自动产出的开发参考手册供使用者快速查阅每个模型包含哪些字段、字段类型是什么、是否必填。整个示例客户端由模板驱动生成根目录的 README.md 明确说明Automatically generated by the Swagger Codegen因此要真正理解这份文档需要把三个层次串起来看层次文件作用模型文档本文主体Tag.md面向使用者的字段速查表生成的 Java 类Tag.java实际可编译运行的客户端模型OpenAPI 定义源头petstore.json生成器的输入规范二、原文档核心内容Tag 的属性表Tag.md 的主体内容是一张属性表逐字继承如下PropertiesNameTypeDescriptionNotesidLong[optional]nameString[optional]这张表的含义非常明确id类型为Long对应 JSON 中的 64 位整数标记为[optional]即该字段在序列化时允许缺失name类型为String同样为[optional]两个字段的Description均为空说明原 OpenAPI 定义中未为它们编写语义描述。[optional]是 swagger-codegen 模型文档的标准标注只要 OpenAPI 定义中该属性未出现在required列表中生成的文档就会在 Notes 列打上[optional]反之若为必填字段则不加标注。对比同目录下的 Pet.md 可以看到name、photoUrls两列 Notes 为空必填而id、category、tags、status都标有[optional]。三、OpenAPI 定义源头Tag 在 petstore.json 中的声明Tag模型的输入定义位于 petstore.json 的definitions段完整声明为Tag: { type: object, properties: { id: { type: integer, format: int64 }, name: { type: string } }, xml: { name: Tag } }对照文档表可以看到生成的字段类型映射规律OpenAPI 的type: integer, format: int64→ Java 的LongOpenAPI 的type: string→ Java 的String未声明required数组 → 文档 Notes 标注[optional]xml.name段仅影响 XML 序列化时的元素命名不影响 JSON 客户端的使用。该模型在 Petstore 中的角色是Pet 的附属标签Pet定义中通过$ref引用它tags: { type: array, xml: { wrapped: true }, items: { xml: { name: tag }, $ref: #/definitions/Tag } }也就是说Pet对象持有一个Tag数组这一关联在生成的 Pet.md 中体现为**tags** | [**Listlt;Taggt;**](https://link.gitcode.com/i/4ac129645a5f162e98ee4b01117970f7)。四、生成的 Java 实现Tag.java 源码解读模型文档描述的字段在客户端中对应生成的 Java 类 Tag.java位于包io.swagger.client.model。其核心结构如下字段与 Gson 序列化注解SerializedName(id) private Long id null; SerializedName(name) private String name null;SerializedName来自 Gsoncom.google.gson.annotations.SerializedName作用是把 Java 字段名与 JSON 键名绑定id序列化为idname序列化为name字段类型Long/String与文档表格中的 Type 列完全一致默认值null对应文档的[optional]语义——未赋值时 JSON 中不输出该键。链式 setterfluent APIpublic Tag id(Long id) { this.id id; return this; } public Tag name(String name) { this.name name; return this; }swagger-codegen 为每个属性同时生成返回this的链式方法方便一行构建对象Tag tag new Tag().id(100L).name(friendly);标准的 getter / setter、equals、hashCode、toString生成的类还包含public Long getId()/public void setId(Long id)public String getName()/public void setName(String name)基于Objects.equals的equals两个字段都相等才相等基于Objects.hash的hashCode打印友好格式的toString含toIndentedString缩进工具方法。这些脚手架方法由 Java 模板统一生成保证所有模型类行为一致可直接放入HashSet、HashMap等容器使用。五、实战使用Tag 在 Pet 对象与 API 调用中的用法5.1 给 Pet 打标签Tag最典型的用法是作为Pet对象的tags列表成员。仓库内的集成测试 PetApiTest.java 的testFindPetsByTags方法给出了完整范例Pet pet createRandomPet(); pet.setName(monster); pet.setStatus(Pet.StatusEnum.AVAILABLE); ListTag tags new ArrayListTag(); Tag tag1 new Tag(); tag1.setName(friendly); tags.add(tag1); pet.setTags(tags); api.updatePet(pet);该测试随后调用api.findPetsByTags(Arrays.asList(friendly))并按标签查询宠物验证了标签-查询的完整闭环。注意这里只设置了name而未设置id正好印证了文档中两个字段均为[optional]的设计——只填name也能正常构建对象并提交服务端。5.2 从服务端读取并遍历标签按 PetApi.md 中的接口签名通过getPetById获取宠物后可直接遍历其标签Pet fetched api.getPetById(pet.getId()); for (Tag t : fetched.getTags()) { System.out.println(t.getName()); }由于 Gson 反序列化时按SerializedName将 JSON 中的tags数组还原为ListTag开发者拿到的就是类型安全的 Java 对象无需手写任何解析逻辑。六、模型文档是如何生成的模板引擎链路模型文档不是凭空出现的它由 swagger-codegen 的模板引擎按 Mustache 模板渲染生成。对 Java 客户端而言渲染入口是 model_doc.mustache{{#models}}{{#model}} {{#isEnum}}{{enum_outer_doc}}{{/isEnum}}{{^isEnum}}{{pojo_doc}}{{/isEnum}} {{/model}}{{/models}}即枚举模型走enum_outer_doc模板普通对象模型走 pojo_doc.mustache。而Tag属于后者其属性表的渲染逻辑为# {{classname}} ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- {{#vars}}**{{name}}** | ... | {{description}} | {{^required}} [optional]{{/required}}...可以看到文档表格的每一列都对应模板中的一个变量文档列模板变量数据来源Name{{name}}属性名Type{{datatype}}由 OpenAPI 类型映射出的 Java 类型Description{{description}}OpenAPI 定义中的descriptionTag为空故留白Notes{{^required}} [optional]{{/required}}是否出现在required列表这也解释了为什么同类型的所有模型文档格式高度统一——它们都来自同一套模板。理解了这条链路后你就能从任何一份生成的模型文档反向推导出原始 OpenAPI 定义的大致形态也能预判生成代码的字段类型与可选性。七、在自有项目中复现安装与生成要点如果你希望在自己的项目中得到类似的模型文档与客户端代码可以按 README.md 的说明使用该仓库的构建产物环境要求为 Java 1.7 与 Maven/Gradle构建并安装客户端到本地仓库mvn clean installMaven 依赖坐标见 pom.xmldependency groupIdio.swagger/groupId artifactIdswagger-petstore-okhttp-gson/artifactId version1.0.0/version scopecompile/scope /dependencyGradle 用户等价写法compile io.swagger:swagger-petstore-okhttp-gson:1.0.0若想从自己的 OpenAPI 定义重新生成客户端包含docs/*.md模型文档可在仓库根目录以java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i 你的定义.json -l java -c config.json方式调用生成器并选择okhttp-gson库library配置项生成器核心逻辑位于 modules/swagger-codegen 模块Java 库的模板与库配置分别位于 modules/swagger-codegen/src/main/resources/Java 与对应的libraries/okhttp-gson目录。八、小结Tag.md 虽然只是一份极简的属性表但它完整串联起了 swagger-codegen 的一条核心工作链OpenAPI 定义petstore.json definitions.Tag → 模板渲染model_doc.mustache pojo_doc.mustache → 生成模型文档docs/Tag.md与 Java 类model/Tag.java → 被 Pet 模型引用参与 API 调用与集成测试掌握本文梳理的文档表格 → OpenAPI 类型 → Java 字段 → Gson 注解 → 实际用法对应关系后再面对 swagger-codegen 输出的任何模型文档你都能快速判断字段类型、可选性与序列化行为并将其直接落地为可运行的客户端代码。赞分享开发工具代码生成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 生成 Java 枚举模型 OuterEnum 全解析从 OpenAPI 定义到 okhttp-gson 客户端swagger codegen 生成 Java 枚举模型 OuterEnum 全解析从 OpenAPI 定义到 okhttp gson 客户端 导读 Oute开发工具代码生成API设计Swagger Codegen 生成的 Java 模型 OuterComposite 详解从 OpenAPI 定义到 okhttp-gson 客户端实战Swagger Codegen 生成的 Java 模型 OuterComposite 详解从 OpenAPI 定义到 okhttp gson 客户端实战 导读开发工具代码生成API设计Swagger Codegen Java okhttp-gson 客户端 EnumTest 枚举模型从 OpenAPI 定义到 Gson 序列化实现全解析Swagger Codegen Java okhttp gson 客户端 EnumTest 枚举模型从 OpenAPI 定义到 Gson 序列化实现全解析 本开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?