ARTICLE DETAIL

资讯详情

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

swagger-codegen 生成 Jersey2 Java 客户端的 UserApi 使用指南:8 个用户管理端点从调用到源码解析

swagger-codegen 生成 Jersey2 Java 客户端的 UserApi 使用指南:8 个用户管理端点从调用到源码解析 swagger-codegen 生成 Jersey2 Java 客户端的 UserApi 使用指南8 个用户管理端点从调用到源码解析【免费下载链接】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 为 Petstore 示例规格生成的 UserApi.md 为核心系统讲解基于 Jersey2 的 Java API 客户端如何完成用户创建、查询、登录与删除等 8 个 RESTful 操作。读者将掌握每个端点的调用签名、参数约束与返回类型并深入到 UserApi.java 与 ApiClient.java 源码理解生成的客户端代码是如何完成参数校验、路径转义、HTTP 请求组装与响应反序列化的。一、UserApi 端点总览该文档生成的客户端基于 OpenAPI/Swagger 定义自动产出所有请求的 Base URI 均指向http://petstore.swagger.io:80/v2。UserApi 共暴露 8 个端点涵盖用户实体的完整生命周期创建单个与批量、查询按用户名、登录/登出会话、删除与更新。方法HTTP 请求描述createUserPOST/userCreate usercreateUsersWithArrayInputPOST/user/createWithArrayCreates list of users with given input arraycreateUsersWithListInputPOST/user/createWithListCreates list of users with given input arraydeleteUserDELETE/user/{username}Delete usergetUserByNameGET/user/{username}Get user by user nameloginUserGET/user/loginLogs user into the systemlogoutUserGET/user/logoutLogs out current logged in user sessionupdateUserPUT/user/{username}Updated user从源码角度看这 8 个方法在 UserApi.java 中一一对应且每个公开方法都配有一个xxxWithHttpInfo变体前者返回业务类型或 void后者返回携带状态码与响应头的ApiResponseT。例如getUserByName内部直接调用getUserByNameWithHttpInfo(username).getData()剥离响应元数据。这一“双方法”模式是 swagger-codegen Java 客户端生成的固定结构便于调用方按需选择是否关注 HTTP 状态细节。二、安装与运行环境准备在调用 UserApi 之前先确认构建环境。生成的 Jersey2 客户端要求Java 1.7与 Maven/Gradle参见 README.md 的 Requirements 部分。依赖坐标定义在 pom.xml 中核心 HTTP 客户端org.glassfish.jersey.core:jersey-client与org.glassfish.jersey.media:jersey-media-json-jacksonJersey 2.29.1JSON 序列化com.fasterxml.jackson.core:jackson-databindJackson 2.6.4Swagger 注解io.swagger:swagger-annotations1.5.24。Maven 用户在工程 POM 中加入依赖dependency groupIdio.swagger/groupId artifactIdswagger-petstore-jersey2/artifactId version1.0.0/version scopecompile/scope /dependencyGradle 用户在构建脚本中加入compile io.swagger:swagger-petstore-jersey2:1.0.0本地构建则执行mvn clean install # 安装到本地 Maven 仓库 mvn clean package # 仅打包产物为 target/swagger-petstore-jersey2-1.0.0.jar 及 target/lib/*.jar三、快速开始最小调用骨架所有 8 个端点的调用模式高度一致实例化UserApi→ 构造参数对象 → try 块中调用 → catchApiException并打印堆栈。以创建用户为例// Import classes: //import io.swagger.client.ApiException; //import io.swagger.client.api.UserApi; UserApi apiInstance new UserApi(); User body new User(); // User | Created user object try { apiInstance.createUser(body); } catch (ApiException e) { System.err.println(Exception when calling UserApi#createUser); e.printStackTrace(); }UserApi拥有两个构造函数无参构造使用Configuration.getDefaultApiClient()带参构造可注入自定义的ApiClient见 UserApi.java。同时提供getApiClient()/setApiClient()供运行时替换。四、createUser创建单个用户HTTPPOST /user说明只能由已登录用户执行This can only be done by the logged in user。参数NameTypeDescriptionNotesbodyUserCreated user object必填返回类型null空响应体鉴权无需鉴权请求头Content-Type 未定义Accept 为application/xml, application/json对应的User模型定义在 User.java包含 8 个可选属性idLong、username、firstName、lastName、email、password、phone均为 String以及userStatusInteger用户状态。模型采用 fluent 风格链式 setter可这样构造User user new User() .id(1L) .username(user1) .firstName(John) .lastName(Doe) .email(johnexample.com) .password(secret) .phone(123-456-7890) .userStatus(1); apiInstance.createUser(user);源码层面createUser会先做必填参数校验——若body null则抛出ApiException(400, Missing the required parameter body when calling createUser)随后组装路径/user、Accept 头并调用apiClient.invokeAPI(...)UserApi.java。由于该端点声明了空请求体内容类型数组Content-Type不会被显式设置。五、批量创建用户createUsersWithArrayInput 与 createUsersWithListInput两个端点行为等价仅入参传输形式不同都对应描述“Creates list of users with given input array”方法HTTP 请求参数类型createUsersWithArrayInputPOST/user/createWithArrayListUsercreateUsersWithListInputPOST/user/createWithListListUser返回类型null空响应体鉴权无需鉴权请求头Content-Type 未定义Accept 为application/xml, application/json调用示例以 Array 版本为例List 版本完全一致UserApi apiInstance new UserApi(); ListUser body Arrays.asList(new User()); // ListUser | List of user object try { apiInstance.createUsersWithArrayInput(body); } catch (ApiException e) { System.err.println(Exception when calling UserApi#createUsersWithArrayInput); e.printStackTrace(); }值得注意从 UserApi.java 可以看到ListUser会被整体序列化为 JSON 数组放入请求体localVarPostBody body而不是作为查询参数或表单字段。这意味着服务端需要按 JSON 数组反序列化用户列表。六、deleteUser删除用户HTTPDELETE /user/{username}说明只能由已登录用户执行。参数NameTypeDescriptionNotesusernameStringThe name that needs to be deleted必填返回类型null空响应体鉴权无需鉴权调用示例UserApi apiInstance new UserApi(); String username username_example; // String | The name that needs to be deleted try { apiInstance.deleteUser(username); } catch (ApiException e) { System.err.println(Exception when calling UserApi#deleteUser); e.printStackTrace(); }这是一个展示路径参数处理的典型端点。在 UserApi.java 中生成的代码先将模板路径/user/{username}中的占位符替换为转义后的真实值String localVarPath /user/{username} .replaceAll(\\{ username \\}, apiClient.escapeString(username.toString()));escapeString由ApiClient提供负责对路径片段做 URL 编码避免用户名中的特殊字符如空格、/、?破坏 URL 结构。同样地username 为 null 时会先抛出 400 级ApiException。七、getUserByName按用户名查询用户HTTPGET /user/{username}说明文档特别注明测试时可使用用户名user1。参数NameTypeDescriptionNotesusernameStringThe name that needs to be fetched. Use user1 for testing.必填返回类型User鉴权无需鉴权调用示例UserApi apiInstance new UserApi(); String username user1; // String | The name that needs to be fetched. Use user1 for testing. try { User result apiInstance.getUserByName(username); System.out.println(result); } catch (ApiException e) { System.err.println(Exception when calling UserApi#getUserByName); e.printStackTrace(); }这是 8 个端点中少数几个有返回体的 GET 端点之一。源码中getUserByNameWithHttpInfo在调用invokeAPI时传入new GenericTypeUser() {}作为返回类型UserApi.java。ApiClient会根据 Accept 头application/xml, application/json优先选择可用的 MIME 类型然后通过 Jackson 将响应体反序列化为User对象若响应为 404用户不存在等非 2xx 状态则抛出携带状态码、消息与响应头的ApiException。八、loginUser用户登录HTTPGET /user/login参数NameTypeDescriptionNotesusernameStringThe user name for login必填passwordStringThe password for login in clear text必填返回类型String服务端返回的会话令牌/状态消息鉴权无需鉴权调用示例UserApi apiInstance new UserApi(); String username username_example; // String | The user name for login String password password_example; // String | The password for login in clear text try { String result apiInstance.loginUser(username, password); System.out.println(result); } catch (ApiException e) { System.err.println(Exception when calling UserApi#loginUser); e.printStackTrace(); }该端点在参数处理上与前几个端点显著不同username与password属于查询参数而非路径参数或请求体。源码中可以看到localVarQueryParams.addAll(apiClient.parameterToPairs(, username, username)); localVarQueryParams.addAll(apiClient.parameterToPairs(, password, password));UserApi.java。parameterToPairs会将标量参数转换成Pair对象最终在invokeAPI中通过target.queryParam(...)追加到 URL 上形成GET /v2/user/login?usernamexxxpasswordxxx。注意文档将密码描述为“明文传输”in clear text生产环境若沿用此接口需配合 HTTPS 使用。九、logoutUser用户登出HTTPGET /user/logout参数该端点无需任何参数This endpoint does not need any parameter。返回类型null空响应体鉴权无需鉴权调用示例UserApi apiInstance new UserApi(); try { apiInstance.logoutUser(); } catch (ApiException e) { System.err.println(Exception when calling UserApi#logoutUser); e.printStackTrace(); }源码层面这是最简单的端点logoutUserWithHttpInfo没有查询参数、没有请求体、没有返回类型直接以 GET 方式调用/user/logoutUserApi.java。它也是理解invokeAPI返回空体处理的样例——当服务端返回 204 No Content 时ApiClient直接构造不带响应体的ApiResponse。十、updateUser更新用户HTTPPUT /user/{username}说明只能由已登录用户执行。参数NameTypeDescriptionNotesusernameStringname that need to be deleted必填bodyUserUpdated user object必填返回类型null空响应体鉴权无需鉴权调用示例UserApi apiInstance new UserApi(); String username username_example; // String | name that need to be deleted User body new User(); // User | Updated user object try { apiInstance.updateUser(username, body); } catch (ApiException e) { System.err.println(Exception when calling UserApi#updateUser); e.printStackTrace(); }updateUserWithHttpInfo是参数组合最复杂的端点同时具备路径参数{username}占位符替换 escapeString转义与请求体参数localVarPostBody body且两个参数都被标记为必填null 时分别抛出对应的 400 级异常UserApi.java。十一、源码级原理UserApi 如何完成一次 API 调用将 8 个端点的共性抽象出来可以得到 swagger-codegen Java 客户端的统一调用链路参数校验每个xxxWithHttpInfo方法开头对必填参数做 null 检查缺失时抛出ApiException(400, Missing the required parameter xxx when calling yyy)路径组装静态路径直接使用含{placeholder}的路径通过replaceAllapiClient.escapeString()做 URL 编码替换参数分类按 OpenAPI 定义把参数分派到 query如 loginUser 的 username/password、path如 deleteUser 的 username或 body如 createUser 的 body头部协商调用apiClient.selectHeaderAccept(...)与apiClient.selectHeaderContentType(...)从端点声明的 Accept/Content-Type 列表中挑选 MIME 类型鉴权应用端点声明无鉴权时localVarAuthNames为空数组updateParamsForAuth不注入任何凭证统一出口所有端点最终汇聚到ApiClient.invokeAPI(...)ApiClient.java它完成拼接basePath path构造WebTarget、追加 query 参数、合并默认头与调用方头、序列化请求体serialize、按 HTTP 方法分发GET/POST/PUT/DELETE/PATCH/HEAD、根据状态码决定反序列化或抛ApiException并在finally中关闭Response。ApiClient还封装了 Jersey2 客户端的基础配置buildHttpClient注册了MultiPartFeature、JacksonFeature与自定义JSON序列化器并开启HttpUrlConnectorProvider.SET_METHOD_WORKAROUND以绕过某些 HTTP 代理对非标准方法的限制ApiClient.java。十二、定制 ApiClientBase URI、超时与调试生成的客户端默认 Base URI 为http://petstore.swagger.io:80/v2实际接入自建服务时需替换。可通过ApiClient链式 API 完成定制再注入UserApiimport io.swagger.client.ApiClient; import io.swagger.client.api.UserApi; ApiClient apiClient new ApiClient() .setBasePath(https://your-api.example.com/v2) .setConnectTimeout(5000) // 连接超时单位毫秒0 表示不超时 .setReadTimeout(5000) // 读取超时单位毫秒0 表示不超时 .setDebugging(true) // 开启 Jersey LoggingFeature打印最多 50K 的请求/响应载荷 .setUserAgent(my-app/1.0); // 覆盖默认 User-Agent UserApi userApi new UserApi(apiClient);相关 setter 的实现setConnectTimeout/setReadTimeout/setDebugging位于 ApiClient.java。其中setDebugging(true)会重建httpClient并注册LoggingFeature日志级别设为ALL对排查请求失败非常有用。README 还建议多线程环境下每个线程单独创建ApiClient实例以避免共享客户端状态引发的并发问题。十三、鉴权机制说明本文档涉及的 8 个用户端点全部标注“No authorization required”因此调用时无需设置凭证。但同一客户端工程中其他端点如 PetApi、StoreApi可能使用以下鉴权方案详见 README.md 的 Documentation for Authorization 部分api_keyAPI Key位于 HTTP 头参数名api_keyapi_key_queryAPI Key位于 URL 查询串参数名api_key_queryhttp_basic_testHTTP Basic 认证petstore_authOAuth 2.0 implicit 流程授权 URL 为http://petstore.swagger.io/api/oauth/dialogScope 含write:pets与read:pets。ApiClient构造函数中已预置这 4 种认证对象ApiClient.java并封装了setUsername/setPassword/setApiKey/setApiKeyPrefix/setAccessToken等便捷方法供需要鉴权的端点使用。如果某个xxxWithHttpInfo方法内部声明的authNames指向未注册的认证名称updateParamsForAuth会抛出RuntimeException(Authentication undefined: ...)。十四、测试与验证仓库为每个 API 类生成了对应的 JUnit 测试骨架UserApiTest.java。测试类被Ignore注解标注默认不参与构建其意图是让开发者填入真实参数后启用。类内部为 8 个方法各生成一个Test用例createUserTest、createUsersWithArrayInputTest、getUserByNameTest、loginUserTest等测试实例通过无参构造获取默认ApiClient。运行测试前需要确保服务端可达并设置正确的 Base URIgetUserByNameTest中可以直接使用文档推荐的测试用户名user1。另外该工程下还有多个同类生成样例如 okhttp-gson、resttemplate 等它们共享同一份 Petstore 规格与相同的UserApi方法集合仅 HTTP 客户端与序列化栈不同可作为横向对照参考。十五、使用要点小结参数必填约束文档中参数表无 Notes 标注“optional”的均为必填null 会触发 400 级ApiException路径参数自动转义含用户名等动态值的端点URL 编码由ApiClient.escapeString统一处理调用方无需手工编码返回体差异createUser、createUsersWithArrayInput、createUsersWithListInput、deleteUser、logoutUser、updateUser返回空响应体getUserByName返回UserloginUser返回StringHTTP 方法与语义对应创建用 POST、批量创建用 POST、查询用 GET、删除用 DELETE、更新用 PUT、登录/登出用 GET与 OpenAPI 规格中的定义一一对应异常处理所有调用统一抛出io.swagger.client.ApiException其中携带状态码、消息、响应头与响应体是排查服务端错误的主要入口。通过本文可以确认UserApi 的 8 个端点覆盖了用户模块“增删改查 会话管理”的完整需求而生成的 Jersey2 客户端代码则将参数校验、URL 组装、HTTP 调用与 JSON 反序列化全部封装在UserApiApiClient两层之中业务代码只需关注参数构造与异常捕获即可完成集成。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表