swagger-codegen 生成的 Jersey1 Java 客户端 StoreApi 使用指南:Petstore 订单与库存接口实战
开发工具代码生成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点击查看免费下载导读StoreApi是 swagger-codegen 为 Petstore 示例生成的 Jersey1 Java 客户端中负责“商店Store”业务域的 API 类封装了订单下单、订单查询、订单删除与库存查询四个接口。本文以 samples/client/petstore/java/jersey1/docs/StoreApi.md 为骨架结合该示例工程中生成的源码、模型与测试用例逐接口讲解调用方式、参数约束、认证配置与底层实现原理帮助你掌握如何阅读和使用这类自动生成的客户端 API 文档并理解其背后的代码生成逻辑。一、StoreApi 概览接口清单与基线地址StoreApi 中所有接口的 URIs 都相对http://petstore.swagger.io:80/v2这一基线地址base path四个方法及其 HTTP 映射如下MethodHTTP requestDescriptiondeleteOrder(orderId)DELETE/store/order/{order_id}Delete purchase order by IDgetInventory()GET/store/inventoryReturns pet inventories by statusgetOrderById(orderId)GET/store/order/{order_id}Find purchase order by IDplaceOrder(body)POST/store/orderPlace an order for a pet从工程结构看这四个方法对应生成的 Java 类 StoreApi.java其构造函数支持两种方式public StoreApi() { this(Configuration.getDefaultApiClient()); } public StoreApi(ApiClient apiClient) { this.apiClient apiClient; }无参构造使用Configuration.getDefaultApiClient()返回的全局默认客户端带参构造允许传入自定义的ApiClient从而覆盖基线地址、认证信息、超时等配置类中还提供了getApiClient()/setApiClient()用于运行期替换客户端实例。对应地READMEsamples/client/petstore/java/jersey1/README.md也给出建议多线程环境下推荐每个线程单独创建ApiClient实例以避免潜在的状态共享问题。二、deleteOrder删除指定 ID 的订单接口说明deleteOrder用于按订单 ID 删除一笔订单。文档特别提示只有小于 1000 的整数 ID 才能得到正常响应大于 1000 或非整数 ID 会触发 API 错误这是 Petstore 测试服务端的约定。调用示例// Import classes: //import io.swagger.client.ApiException; //import io.swagger.client.api.StoreApi; StoreApi apiInstance new StoreApi(); String orderId orderId_example; // String | ID of the order that needs to be deleted try { apiInstance.deleteOrder(orderId); } catch (ApiException e) { System.err.println(Exception when calling StoreApi#deleteOrder); e.printStackTrace(); }参数说明NameTypeDescriptionorderIdStringID of the order that needs to be deleted必填参数传null会抛出ApiException(400, Missing the required parameter orderId when calling deleteOrder)注意路径中的占位符是{order_id}但方法参数名是orderId二者在代码生成阶段完成了映射。返回与响应Return typenull空响应体。当服务端返回204 NO_CONTENT时invokeAPI直接返回nullAuthorization无需认证HTTP 请求头Content-Type 未定义Accept 为application/xml, application/json。源码实现要点在 StoreApi.java 中deleteOrder通过三步完成请求构造校验必填参数orderId null时抛出 400 异常路径替换/store/order/{order_id}.replaceAll(\\{order_id\\}, apiClient.escapeString(orderId.toString()))其中escapeString负责对路径片段做 URL 编码调用apiClient.invokeAPI(path, DELETE, ..., null)最后一个参数为null表示不需要返回类型对应文档中的“空响应体”。三、getInventory按状态返回宠物库存接口说明getInventory无需任何参数返回状态码到数量的映射即MapString, Integer。例如{available: 5, pending: 2}。调用示例含 API Key 认证配置// Import classes: //import io.swagger.client.ApiClient; //import io.swagger.client.ApiException; //import io.swagger.client.Configuration; //import io.swagger.client.auth.*; //import io.swagger.client.api.StoreApi; ApiClient defaultClient Configuration.getDefaultApiClient(); // Configure API key authorization: api_key ApiKeyAuth api_key (ApiKeyAuth) defaultClient.getAuthentication(api_key); api_key.setApiKey(YOUR API KEY); // Uncomment the following line to set a prefix for the API key, e.g. Token (defaults to null) //api_key.setApiKeyPrefix(Token); StoreApi apiInstance new StoreApi(); try { MapString, Integer result apiInstance.getInventory(); System.out.println(result); } catch (ApiException e) { System.err.println(Exception when calling StoreApi#getInventory); e.printStackTrace(); }参数与返回Parameters无Return typeMapString, IntegerAuthorization需要api_key见 README 认证章节API key 类型参数名api_key位置为 HTTP headerHTTP 请求头Content-Type 未定义Accept 为application/json。源码实现要点从源码看getInventory是唯一带认证的 Store 接口其关键差异点有两处认证名数组String[] localVarAuthNames new String[] { api_key };其余三个 Store 接口均为空数组泛型返回通过new GenericTypeMapString, Integer() {}声明返回类型交给 Jersey 反序列化 JSON 响应。ApiKeyAuth 的底层机制认证的具体注入逻辑在 ApiKeyAuth.javaOverride public void applyToParams(ListPair queryParams, MapString, String headerParams) { if (apiKey null) { return; } String value; if (apiKeyPrefix ! null) { value apiKeyPrefix apiKey; } else { value apiKey; } if (query.equals(location)) { queryParams.add(new Pair(paramName, value)); } else if (header.equals(location)) { headerParams.put(paramName, value); } }未设置 API Key 时静默跳过不注入任何参数设置了apiKeyPrefix如Token时实际发送值为prefix apiKey未设置时直接发送 apiKey 本身由于 Petstore 的api_key位于 header最终会写入请求头api_key: value。该认证参数在invokeAPI中被updateParamsForAuth遍历应用见 ApiClient.java随后进入实际 HTTP 调用。四、getOrderById按 ID 查询订单接口说明getOrderById按订单 ID 查询订单详情。文档提示ID 取 ≤ 5 或 10 的整数才能得到正常响应其他值会触发异常同样是 Petstore 测试服务端人为设定的行为。调用示例// Import classes: //import io.swagger.client.ApiException; //import io.swagger.client.api.StoreApi; StoreApi apiInstance new StoreApi(); Long orderId 789L; // Long | ID of pet that needs to be fetched try { Order result apiInstance.getOrderById(orderId); System.out.println(result); } catch (ApiException e) { System.err.println(Exception when calling StoreApi#getOrderById); e.printStackTrace(); }参数说明NameTypeDescriptionorderIdLongID of pet that needs to be fetched与deleteOrder不同这里的orderId是Long类型必填参数传null同样抛出 400ApiException。返回与响应Return typeOrder即生成的Order模型Authorization无需认证HTTP 请求头Content-Type 未定义Accept 为application/xml, application/json服务端可能返回 XML 或 JSON由ApiClient.selectHeaderAccept依据优先级协商。源码实现要点getOrderById在 StoreApi.java 中的实现与deleteOrder高度相似唯一区别是使用GenericTypeOrder声明返回类型invokeAPI返回Order对象由 Jersey 将响应体反序列化为模型实例。Order 模型字段依据 Order.mdOrder模型包含以下可选字段NameTypeDescriptionidLongpetIdLongquantityIntegershipDateOffsetDateTimestatusStatusEnumOrder StatuscompleteBoolean其中StatusEnum的取值固定为三个枚举NameValuePLACEDplacedAPPROVEDapprovedDELIVEREDdelivered五、placeOrder为宠物下单接口说明placeOrder以Order对象为请求体创建一笔订单返回服务端生成含 id的完整订单。调用示例// Import classes: //import io.swagger.client.ApiException; //import io.swagger.client.api.StoreApi; StoreApi apiInstance new StoreApi(); Order body new Order(); // Order | order placed for purchasing the pet try { Order result apiInstance.placeOrder(body); System.out.println(result); } catch (ApiException e) { System.err.println(Exception when calling StoreApi#placeOrder); e.printStackTrace(); }参数说明NameTypeDescriptionbodyOrderorder placed for purchasing the pet必填参数传null抛出 400ApiException请求体对象会被序列化并作为POST请求的 body 发送。返回与响应Return typeOrderAuthorization无需认证HTTP 请求头Content-Type 未定义Accept 为application/xml, application/json。源码实现要点在 StoreApi.java 中placeOrder与其余三个方法的差异在于请求体Object localVarPostBody body;即把Order直接作为 body路径/store/order无路径参数因此不需要replaceAll替换方法POSTinvokeAPI中builder.type(contentType).post(...)序列化逻辑见 ApiClient.java 的serialize方法——当 Content-Type 为 JSON 时交给 Jersey/JAXB 处理若是表单或 multipart 则走对应的参数编码路径。六、测试用例接口之间的真实调用关系StoreApiTest.java 是这四个接口的最佳实践演示它直接印证了接口间的协作流程测试初始化Before public void setup() { api new StoreApi(); // setup authentication ApiKeyAuth apiKeyAuth (ApiKeyAuth) api.getApiClient().getAuthentication(api_key); apiKeyAuth.setApiKey(special-key); // set custom date format that is used by the petstore server api.getApiClient().setDateFormat(new SimpleDateFormat(yyyy-MM-ddTHH:mm:ss.SSSZ)); }要点测试中通过api.getApiClient().getAuthentication(api_key)拿到认证器并设置测试 Keyspecial-key并为 petstore 服务端定制日期格式yyyy-MM-ddTHH:mm:ss.SSSZ否则shipDate的序列化可能与服务端不兼容。库存测试Test public void testGetInventory() throws Exception { MapString, Integer inventory api.getInventory(); assertTrue(inventory.keySet().size() 0); }验证getInventory返回非空映射即鉴权成功后能拿到库存数据。下单与回查测试Test public void testPlaceOrder() throws Exception { Order order createOrder(); api.placeOrder(order); Order fetched api.getOrderById(order.getId()); assertEquals(order.getId(), fetched.getId()); assertEquals(order.getPetId(), fetched.getPetId()); assertEquals(order.getQuantity(), fetched.getQuantity()); assertTrue(order.getShipDate().isEqual(fetched.getShipDate())); }完整的“下单 → 按 ID 回查 → 字段一致性校验”链路说明placeOrder与getOrderById应当搭配使用。删除闭环测试Test public void testDeleteOrder() throws Exception { Order order createOrder(); api.placeOrder(order); Order fetched api.getOrderById(order.getId()); assertEquals(fetched.getId(), order.getId()); api.deleteOrder(String.valueOf(order.getId())); try { api.getOrderById(order.getId()); // fail(expected an error); } catch (ApiException e) { // ok } }演示完整生命周期下单 → 确认存在 → 删除 → 再次查询应抛出ApiException正好呼应文档中“大于 1000 或非整数 ID 会产生 API 错误”的行为说明。构造测试订单private Order createOrder() { Order order new Order(); order.setPetId(200L); order.setQuantity(13); order.setShipDate(OffsetDateTime.now().withNano(123000000)); order.setStatus(Order.StatusEnum.PLACED); order.setComplete(true); // 通过反射设置 idpetstore 服务端存在小数位 bug需固定 3 位小数 ... return order; }注意源码注释Ensure 3 fractional digits because of a bug in the petstore server——即 petstore 测试服务端要求shipDate保留 3 位小数因此测试用withNano(123000000)固定纳秒值。七、如何阅读这类自动生成的 API 文档StoreApi.md是 swagger-codegen 依据 OpenAPI/Swagger 定义自动生成的接口文档其结构对仓库中其他 API 文档如 PetApi.md、UserApi.md完全一致可按以下套路快速上手看头部表格确定方法签名、HTTP 方法与路径模板路径中的{param}即方法参数看 Parameters 表确认参数类型String / Long / 模型对象与是否必填类型决定了调用时的强类型约束看 Return typenull表示无返回体如 deleteOrderOrder、MapString, Integer等表示返回模型的类型看 Authorization无认证的接口可直接调用带认证的接口如getInventory的api_key需先通过Configuration.getDefaultApiClient().getAuthentication(...)配置凭证看 HTTP 请求头了解服务端支持的响应格式Accept与请求格式Content-Type涉及 XML/JSON 协商或表单提交时尤其重要对照源码文档中的每个接口都能在src/main/java/io/swagger/client/api/下找到同名实现类与对应方法参数校验、路径替换、认证数组、泛型返回类型均可逐行核对。八、工程集成与运行环境该示例客户端是一个完整的 Maven 工程pom.xml坐标io.swagger:swagger-java-client:1.0.0基于 Jersey 1.xcom.sun.jersey实现。集成方式Maven在依赖中加入io.swagger:swagger-java-client:1.0.0compile scopeGradlecompile io.swagger:swagger-java-client:1.0.0本地安装执行mvn install安装到本地仓库或mvn package后手动引入target/swagger-java-client-1.0.0.jar与target/lib/*.jar测试运行mvn test即可运行包括StoreApiTest在内的全部单元测试surefire 已配置-Xms512m -Xmx1500m与 per-test fork 模式。需要说明本文涉及的 Petstore 示例面向在线测试服务http://petstore.swagger.io/v2StoreApi.md 基线为http://petstore.swagger.io:80/v2如自建服务端可通过自定义ApiClient的basePath覆盖基线地址。总结StoreApi 覆盖了业务域中最典型的四类接口形态无参查询getInventory、路径参数查询getOrderById、路径参数删除deleteOrder与请求体写入placeOrder并完整演示了 API Key 认证的配置方式。通过将自动生成的 StoreApi.md 与 StoreApi.java、StoreApiTest.java 对照阅读你可以快速掌握 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 Bash 客户端 StoreApi 实战指南用 petstore-cli 调用 Petstore 订单与库存接口Swagger Codegen Bash 客户端 StoreApi 实战指南用 petstore cli 调用 Petstore 订单与库存接口 导读 本指南开发工具代码生成API设计swagger-codegen 生成的 C 客户端 StoreApi 使用指南Petstore 订单与库存接口全解析swagger codegen 生成的 C 客户端 StoreApi 使用指南Petstore 订单与库存接口全解析 导读 本篇技术指南聚焦 swagger开发工具代码生成API设计Swagger Codegen 生成的 Dart Flutter Petstore StoreApi 使用指南订单与库存接口实战Swagger Codegen 生成的 Dart Flutter Petstore StoreApi 使用指南订单与库存接口实战 导读 StoreApi 是开发工具代码生成API设计上一篇OpenCore辅助工具完全指南ocvalidate、macrecovery与MacEfiUnpack 3 个必装实用程序实战用法下一篇IdentityCache关联缓存深度解析如何用cache_has_many和cache_has_one优化查询创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

高通Camera PDAF调试:Type2到Type3迁移的五个关键环节

高通Camera PDAF调试:Type2到Type3迁移的五个关键环节

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 2:43:18 阅读更多 →
零基础入门网络安全:从Web安全到渗透测试的完整学习路线

零基础入门网络安全:从Web安全到渗透测试的完整学习路线

想入行网络安全,最怕的不是零基础,而是被信息差带偏。你打开搜索引擎敲下“网络安全”四个字,前排几乎全是培训机构的就业广告、看起来很高大上的工具录屏、以及互相抄来抄去的过时教程。真正能告诉你第一步学什么、第二步练什么、学到什么程…

2026/9/25 2:43:18 阅读更多 →
Cursor 辅助编程任务实战:用 TaoToken 统一 Key 打通 settings.json 配置

Cursor 辅助编程任务实战:用 TaoToken 统一 Key 打通 settings.json 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 2:43:18 阅读更多 →

最新新闻

基于SpringBoot+Vue的科普平台的设计与实现

基于SpringBoot+Vue的科普平台的设计与实现

一、项目简介为满足大众在线获取科学知识、浏览科普文章、互动交流的需求,本项目设计并实现了基于SpringBootVue的科普资讯平台。系统采用前后端分离架构,后端使用SpringBootMyBatis实现业务逻辑与数据持久化,前端通过Vue搭建交互页面&#x…

2026/9/25 6:46:17 阅读更多 →
【数据分析八步法】确定指标口径、分析维度与对比基准

【数据分析八步法】确定指标口径、分析维度与对比基准

小周与运营经理确认了分析任务:评估可比门店最近四周的经营变化,为下一轮促销决策提供依据。刚准备取数,财务报表写着收入 91 万,运营看板写着成交额 104 万,门店日报又写着 97 万。三个数字都可能计算正确,却回答着不同问题。若不先统一口径,后续精细的分组分析只会把分…

2026/9/25 6:46:17 阅读更多 →
OpenClaw 工具调用完整链路拆解:从 AgentEvent 到 tool_result 的配置与验证

OpenClaw 工具调用完整链路拆解:从 AgentEvent 到 tool_result 的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:46:16 阅读更多 →
Atlas 300V 24G加速卡AI推理实战:YOLO模型迁移与部署全流程

Atlas 300V 24G加速卡AI推理实战:YOLO模型迁移与部署全流程

看到“atlas 300v 24g 是运算加速卡吗”这个搜索词时,我第一反应是:提问的人大概率刚把板卡拿到手。Atlas 这个前缀现在覆盖了太多硬件,有人拿它当训练卡用,有人想直接跑 GPU 原生的 Python 推理脚本,结果一上来就发现…

2026/9/25 6:46:16 阅读更多 →
Allegro转PADS全流程解析:工具选型、映射与常见故障排除

Allegro转PADS全流程解析:工具选型、映射与常见故障排除

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:46:16 阅读更多 →
从2024年APT报告提炼威胁情报基线:组织画像、检测规则与行业防御实践

从2024年APT报告提炼威胁情报基线:组织画像、检测规则与行业防御实践

简介:《2024年全球高级持续性威胁(APT)研究报告》由360高级威胁研究院发布,基于360安全大模型与全网安全大数据视野,系统梳理2024年全球APT攻击态势、活跃组织与攻击手法,为政企机构、安全运营人员和威胁情…

2026/9/25 6:45:16 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →