自动生成接口代码

Posted by boredream on August 31, 2021

程序是为了提升生活中各类工作的效率。那编码效率如何提升呢?

  • 优秀的架构
  • 封装好的各类功能/UI组件
  • 功能丰富的IDE
  • 基于IDE的各种插件

即使有以上各类帮助,但依然有枯燥重复的代码编写工作。这里以安卓客户端「接口代码编写」为例讨论下解决思路

接口代码编写流程

  1. 查看服务端文档
  2. 根据文档编写实体类
  3. 封装接口信息(url、request、response)
  4. 调用接口,让数据展示到UI等

4的逻辑需要灵活处理,重点是解决2、3步骤的重复枯燥编码

目标接口和代码示例

api
api

1
2
3
4
5
6
/**
 * 业代问题详情接口
 */
@GET("question/feedback/getQuestionDetail")
Observable<BaseResponse<QuestionFeedback>> getQuestionDetail(
        @Query("questionUid") String questionUid);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class QuestionFeedback implements Serializable {

    // 审核人
    private String auditName;

    // 审核人工号
    private String auditSiebleUid;

    // 是否有共性 0:否,1:是
    private int baseFlag;

    // 紧急程度,0:紧急,1:一般
    private int clamantLevel;

    // 操作明细
    private ArrayList<QuestionFeedbackDetail> detailDtoList;

    // 问题反馈时长
    private String feedbackDuration;

    // 重要程度,0:Hot 1:Warm 2:Cold
    private int importantLevel;

    // 问题分类,可用值:QU_CA_001,QU_CA_002,QU_CA_003,QU_CA_004,QU_CA_005,QU_CA_006,QU_CA_007
    private String questionCategory;

    // 问题描述
    private String questionDesc;

    // 照片
    private String questionPhoto;

    // 问题状态,可用值:IN_AUDIT,WAIT_EDIT,WAIT_PROCESS,FEEDBACK,UPGRADE,DONE,REVOKE,DISCARD
    private String questionStatus;

    // 更多字段 ...

}

问题

  • 接口query or path字段过多时,需要手动写,且必须挨个复制,否则错一个字母会出问题。
  • 实体类字段过多时,需要挨个写。
  • 字段意义不明时,还需要额外给字段标注释。

解决方案

AndroidStudio 的 GsonFormat 插件

api
缺点:必须先拿到返回的json字符串,且生成的实体类没有注释。

自动生成代码脚本

基础思路:
  1. 获取接口文档信息并解析
  2. 根据已获取的接口信息,自动拼接成所需代码,或自动生成代码文件
  3. 复制自动生成的代码或文件到项目中 api
拓展
  • 可以批量处理接口文档,相同实体类还可以去重处理
  • 生成代码的方式不限,java/python脚本,或直接编写IDE插件,做成网页在线版工具
  • 解析接口信息后,生成Android/iOS/Web代码都可以
  • 除了接口文档,其它任何重复代码也都可以类似思路解决