
其实是我做了个开源工具(^__^),拿出来给大家鉴赏下,欢迎大家提意见
项目: https://github.com/xuyt11/x-http-wrapper 欢迎关注和 star 。
功能:这是一个 http 相关代码的创建工具。
现在我们每一次发版,基本上都会涉及到 http 相关的修改,以此来满足发版的业务需求。
而在其中需要添加或修改的有 http request 、 http request param 、 http response entity 等其他相关的 http 代码。
而在多次的修改中,若前后端没有协调好,就有可能会造成之后的返工、重复修改与线上 bug 量的增加等问题。
如何解决每次发版时,都需要新增、修改 http 相关代码!
如何解决每次发版时,修改 http 相关代码造成的错误!
其实很简单,就是一个词“规范”,任何事情,只要我们有了一定的规范,就会有一定的流程、可追踪并且降低难度。
我相信 99.99%的公司,都会有相关的 http 接口文档提供给前端同学,而且也会自己的一套规范(不论是我现在依赖的 apidocjs ,还是上家公司的 doc 文件)。
当然,肯定也有口头约定的情况,但这需要在之后,立即将约定转化为文档,提供给前端的同学。 git 、 http 都可以作为提供的形式。
我们依赖这个 http 的规范,就可以将 http 接口文档去解析转义为 x-http-wrapper 内部的 API 数据。
再来就是依赖一定的规范(x-http-wrapper 的模板文件规范),将内部 API 数据转化为 http 相关文件。这样,每次只要接口文档更新过后,我们就可以根据文档生成各个程序内部可以运行的代码。
这个功能与现在 IDE 中的 getter 、 setter 方法生成器功能其实是相同的原理!
public class HttpApi { private static Account account; private static Data data; private static Message message; public static Account account() { if (null == account) { account = Account.getInstance(); } return account; } public static Data data() { if (null == data) { data = Data.getInstance(); } return data; } public static Message message() { if (null == message) { message = Message.getInstance(); } return message; } } public class Account extends BaseApi { public static Account getInstance() { return Helper.instance; } private static class Helper { public static final Account instance = new Account(); } private Account() { super(); } /** * @version 2.0.0 * @requestUrl * @title 初始化账号信息 * */ public RequestHandle init(Context cxt001, ResponseHandlerInterface response) { // hide implementation } /** * @version 2.0.0 * @title 扫二维码到 web 端进行操作 * * @param context String desc * @param project_id isOptional Integer desc * @param scene isOptional String desc * @param uuid_rand String desc */ public RequestHandle qrcodeConfirm(Context cxt001, String context, Integer project_id, String scene, String uuid_rand, ResponseHandlerInterface response) { // hide implementation } /** * 缩略请求方法 */ public RequestHandle qrcodeConfirm(Context cxt001, QrcodeConfirmRP.Parameter parameter, ResponseHandlerInterface response) { return qrcodeConfirm(cxt001, parameter.context, parameter.project_id, parameter.scene, parameter.uuid_rand, response); } } /** * 请求方法参数 */ public class QrcodeConfirmRP implements Serializable { public static final class Parameter implements Serializable { /** * type: String<br> * isOptional : false<br> * desc: <p>扫码场景,枚举值</p> */ public String context; /** * type: Integer<br> * isOptional : true<br> * desc: <p>业务参数: 根据 context 的不同而不同</p> */ public Integer project_id; /** * type: String<br> * isOptional : true<br> * desc: <p>身份信息: 服务端会优先使用客户端传入的身份信息,当为”投资人“的时候必传</p> */ public String scene; /** * type: String<br> * isOptional : false<br> * desc: <p>从二维码扫描得到的唯一码</p> */ public String uuid_rand; } } public class Init { private long member_id; private long member_role; private long member_status; private String ry_token; private long step; public long getMemberId() {return member_id;} public long getMemberRole() {return member_role;} public long getMemberStatus() {return member_status;} public String getRyToken() {return ry_token;} public long getStep() {return step;} public void setMemberId(long member_id) {this.member_id = member_id;} public void setMemberRole(long member_role) {this.member_role = member_role;} public void setMemberStatus(long member_status) {this.member_status = member_status;} public void setRyToken(String ry_token) {this.ry_token = ry_token;} public void setStep(long step) {this.step = step;} } public class StatusCode { /** '') */ public static final int OK = 0; /** '登录状态已过期,请重新登入') */ public static final int UNAUTHORIZED = 101; /** '您没有权限查看') */ public static final int FORBIDDEN = 102; /** '资源未找到') */ public static final int NOT_FOUND = 103; /** '客户端请求错误') # 4XX 客户端错误 */ public static final int CLIENT_ERROR = 228; /** '服务器错误') # 5XX 服务器错误 */ public static final int SERVER_ERROR = 229; /** '参数错误') */ public static final int PARAM_ERROR = 230; /** '登录失败,请检查您的邮箱地址是否正确') */ public static final int LOGIN_FAIL_EMAIL_NOT_EXIST = 332; /** '登录失败,请确认您的手机号是否正确') */ public static final int LOGIN_FAIL_MOBILE_NOT_EXIST = 333; /** '登录失败,请检查密码是否正确') */ public static final int LOGIN_FAIL_PASSWORD_ERROR = 334; } public class ResponseEntity<T> { private int status_code; private String message; private Error error; private T data; public int getStatusCode() {return status_code;} public void setStatusCode(int status_code) {this.status_code = status_code;} public String getMessage() {return message;} public void setMessage(String message) {this.message = message;} public Error getError() {return error;} public void setError(Error error) {this.error = error;} public T getData() {return data;} public void setData(T data) {this.data = data;} public static class Error { private String detail; private List<String> device_token; private List<String> content; private List<String> followed_id; public String getDetail() {return detail;} public void setDetail(String detail) {this.detail = detail;} public List<String> getDeviceToken() {return device_token;} public void setDeviceToken(List<String> device_token) {this.device_token = device_token;} public List<String> getContent() {return content;} public void setContent(List<String> content) {this.cOntent= content;} public List<String> getFollowedId() {return followed_id;} public void setFollowedId(List<String> followed_id) {this.followed_id = followed_id;} } } "api_data": { "source": "apidocjs", "file_path_type": "file", "file_path_infos": [ { "os_name": "Mac OS X", "path": "api_data.json 的绝对路径" }, { "os_name": "Windows", "path": "api_data.json 的绝对路径" } ], "file_charset": "UTF-8" } { "file_name":"HttpApi.swift", "file_dirs":[ { "os_name":"Windows", "path":"生成文件的目标路径(绝对路径)" }, { "os_name":"Mac OS X", "path":"生成文件的目标路径(绝对路径)" } ] } "template_file_infos": { "HttpApi": { "need_generate": true, "path": "ncm_ios_n-httpapi.xhwt" }, ... } java -jar x-http-wrapper.jar xxxx/x-http-wrapper.json java -jar x-http-wrapper.jar xxx/x-http-wrapper.json <t:foreach each="request_groups"> </t:foreach> 匹配的 request_groups 即为反射后去 request_groups 方法的数据,然后利用该数据去遍历;