前段时间发现一个很好用的API管理工具--API管家,用了一段时间,已经感觉离不开了,抱着分享使我快乐的想法,因为刚开始用的时候随便写过一篇简介,不是很详细,所以现在就重新写,把我这段时间使用的经验和大家一起讨论。

进入正题:打开浏览器,输入www.apigj.com 来到首页,接下来自然是登录或注册了

创建一个新账号,成功后会来到项目列表界面,会提示是否需要创建示例项目,点击确定后,就会创建一个新的项目出来

点击进入示例项目,示例项目一共有1个文件夹和5个接口,可以看到没有经过测试,都在未测试状态

点击某个接口,接口文档就显示出来了,有请求的URL,版本号,描述,请求方式,参数等等,左上角是对接口的操作按扭

点击编辑,可以看到编辑接口的界面,注意我红色圈出的位置是个tab控件,可以点击切换编辑的内容

把请求Class的openid直接删除,点击保存

回到接口文档页面,可以看到openid已经从请求Class里消失了,这里还有个特别的功能,我用红色图出了,点击会生成mock参数

点击左上角的生成按扭,这里就是Api管家最大特色了,可以直接生成代码

点击生成代码,会出现语言的选项,一共9种语言,对我来说是足够用了

举个栗子,我常用的Java(咖啡杯),又分3种引入包

选择Gson

请求和返回的Class文件就直接生成了,值的提一下的是ResSendSms继承于ResCommon,这个是在文档中编辑的,下次再展开细说编辑的功能

上生成的代码,里面自动带了文档中的描述作为注释,实在是太方便了

 /***
* @接口:SendSMS
* @URL:host + /sendsms
* @编码:www.apigj.com
* @版本号:1.1
***/ import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; @JsonAdapter(ReqSendSms.ReqSendSmsTypeAdapter.class)
public class ReqSendSms {
// 类型版本,用于查询类型是否已过期
public static final int Version = 2; /***
* 参数描述:用户手机号
* 是否可为空:否
***/
@SerializedName("mobile")
private String mobile;
public String getMobile(){
return mobile;
}
public void setMobile(String mobile){
this.mobile = mobile;
} /***
* 检查类型完整性
*
* @return true代表类型通过完整性检查
***/
public boolean checkVarRequire() {
if(getMobile() == null){
System.out.println("Lake of (mobile)");
return false;
}
return true;
} public static class ReqSendSmsTypeAdapter<T> extends TypeAdapter<ReqSendSms> {
@Override
public void write(JsonWriter out, ReqSendSms value) throws IOException {
out.beginObject();
writeOBJ(out, (ReqSendSms)value);
out.endObject();
} protected void writeOBJ(JsonWriter out, ReqSendSms value) throws IOException {
out.name("mobile").value(value.getMobile());
} @Override
public ReqSendSms read(JsonReader in) throws IOException {
ReqSendSms res = new ReqSendSms();
in.beginObject();
while (in.hasNext()) {
String propertyName = in.nextName();
if(!readOBJ(res, in, propertyName)) {
in.skipValue();
}
}
in.endObject();
return res;
} protected boolean readOBJ(ReqSendSms res, JsonReader in, String propertyName) throws IOException {
if (propertyName.equals("mobile")) {
try {
res.setMobile(in.nextString());
} catch(IllegalStateException e) {in.skipValue();}
return true;
}
return false;
} } }

请求类 ReqSendSms.java

 /***
* @接口:SendSMS
* @URL:host + /sendsms
* @编码:www.apigj.com
* @版本号:1.1
***/ import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; @JsonAdapter(ResCommon.ResCommonTypeAdapter.class)
public class ResCommon {
// 类型版本,用于查询类型是否已过期
public static final int Version = 1; /***
* 参数描述:返回码
* 是否可为空:否
***/
@SerializedName("code")
private Integer code;
public Integer getCode(){
return code;
}
public void setCode(Integer code){
this.code = code;
} /***
* 参数描述:返回提示
* 是否可为空:是
***/
@SerializedName("msg")
private String msg;
public String getMsg(){
return msg;
}
public void setMsg(String msg){
this.msg = msg;
} /***
* 检查类型完整性
*
* @return true代表类型通过完整性检查
***/
public boolean checkVarRequire() {
if(getCode() == null){
System.out.println("Lake of (code)");
return false;
}
return true;
} public static class ResCommonTypeAdapter<T> extends TypeAdapter<ResCommon> {
@Override
public void write(JsonWriter out, ResCommon value) throws IOException {
out.beginObject();
writeOBJ(out, (ResCommon)value);
out.endObject();
} protected void writeOBJ(JsonWriter out, ResCommon value) throws IOException {
out.name("code").value(value.getCode());
out.name("msg").value(value.getMsg());
} @Override
public ResCommon read(JsonReader in) throws IOException {
ResCommon res = new ResCommon();
in.beginObject();
while (in.hasNext()) {
String propertyName = in.nextName();
if(!readOBJ(res, in, propertyName)) {
in.skipValue();
}
}
in.endObject();
return res;
} protected boolean readOBJ(ResCommon res, JsonReader in, String propertyName) throws IOException {
if (propertyName.equals("code")) {
try {
res.setCode(in.nextInt());
} catch(IllegalStateException e) {in.skipValue();}
return true;
}
else if (propertyName.equals("msg")) {
try {
res.setMsg(in.nextString());
} catch(IllegalStateException e) {in.skipValue();}
return true;
}
return false;
} } }

返回类的父类 ResCommon.java

 /***
* @接口:SendSMS
* @URL:host + /sendsms
* @编码:www.apigj.com
* @版本号:1.1
***/ import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; @JsonAdapter(ResSendSms.ResSendSmsTypeAdapter.class)
public class ResSendSms extends ResCommon {
// 类型版本,用于查询类型是否已过期
public static final int Version = 2; /***
* 参数描述:事件ID,记录接收短信的用户
* 是否可为空:否
***/
@SerializedName("eventid")
private String eventid;
public String getEventid(){
return eventid;
}
public void setEventid(String eventid){
this.eventid = eventid;
} /***
* 检查类型完整性
*
* @return true代表类型通过完整性检查
***/
public boolean checkVarRequire() {
if(!super.checkVarRequire()){
return false;
}
if(getEventid() == null){
System.out.println("Lake of (eventid)");
return false;
}
return true;
} public static class ResSendSmsTypeAdapter<T> extends ResCommonTypeAdapter<ResSendSms> {
@Override
public void write(JsonWriter out, ResCommon value) throws IOException {
out.beginObject();
writeOBJ(out, (ResSendSms)value);
out.endObject();
} protected void writeOBJ(JsonWriter out, ResSendSms value) throws IOException {
super.writeOBJ(out, value);
out.name("eventid").value(value.getEventid());
} @Override
public ResSendSms read(JsonReader in) throws IOException {
ResSendSms res = new ResSendSms();
in.beginObject();
while (in.hasNext()) {
String propertyName = in.nextName();
if(!readOBJ(res, in, propertyName)) {
in.skipValue();
}
}
in.endObject();
return res;
} protected boolean readOBJ(ResSendSms res, JsonReader in, String propertyName) throws IOException {
if (super.readOBJ(res, in, propertyName)) {
return true;
}else
if (propertyName.equals("eventid")) {
try {
res.setEventid(in.nextString());
} catch(IllegalStateException e) {in.skipValue();}
return true;
}
return false;
} } }

返回类 ResSendSms.java

具体请求返回代码还是要自己写的,希望API管家继续完善,以后也可以自动生成把URL和请求方法,请求头包括进去,那就更完美了(懒癌又发作了)。。。

Api管家系列(一):初探的更多相关文章

  1. Api管家系列(三):测试和Rest Client

    今天我们来看一下Api管家的测试功能 在项目首页可以看到,测试过的接口和未测试的接口,点击环型图能列出相应的接口 我们选择未测试的,这些接口我都已经实现好了,只是没有用API管家进行测试,所以还显示未 ...

  2. Api管家系列(二):编辑和继承Class

    上篇写了个大概,今天我详细说一下参数的编辑,废话不多说 先打开一个项目,我要特别说一下设置里的“默认参数设置” 打开默认参数设置,这里我用红色圈出的tab可以设置请求头,返回头和返回状态,这些设置会在 ...

  3. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  4. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  5. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  6. 淘宝API开发系列---阿里.聚石塔.开放平台的使用

    好久没有继续跟进淘宝的API使用了,有很多做相关应用的同行都来咨询,很多都因为自己开发工作比较忙而没有来得及好的处理,前几天,有一个朋友叫帮忙指导如何使用淘宝API,由于原来有一些成熟的例子应用,因此 ...

  7. ASP.NET Web API实践系列04,通过Route等特性设置路由

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  8. 构建安全的Xml Web Service系列之初探使用Soap头

    原文:构建安全的Xml Web Service系列之初探使用Soap头 Xml Web Service 从诞生那天就说自己都么都么好,还津津乐道的说internet也会因此而进入一个新纪元,可5年多来 ...

  9. 循序渐进学.Net Core Web Api开发系列【0】:序言与目录

    一.序言 我大约在2003年时候开始接触到.NET,最初在.NET framework 1.1版本下写过代码,曾经做过WinForm和ASP.NET开发.大约在2010年的时候转型JAVA环境,这么多 ...

随机推荐

  1. ZooKeeper的安装

    一.准备 需要提前安装好Java 准备好zookeeper的软件包:软件包地址   二.部署 解压zookeeper压缩包到指定目录 执行如下命令: .tar.gz -C /opt/   三.修改配置 ...

  2. 玩转Spring MVC (一)---控制反转(依赖注入)

    Spring的核心是控制反转,什么是控制反转呢?小编浅述一下自己的拙见,有不当之处还希望大家指出. 控制反转(IOC),也可以叫做依赖注入(DI),这两个词其实是一个概念. 控制反转,那是什么控制被反 ...

  3. 通过MSSQL分析器跟踪研究EM内部行为并解决identify列问题

    今天有人问到MSSQL表里的IDENTITY字段,如何让它在复制原来数据到该表时,原来数据的IDENTITY字段不变,而新插入数据时,新插入的数据的IDENTITY依然增长,查了些资料,做了个实验,最 ...

  4. markdown中如何插入公式

    转自 :https://www.tuicool.com/articles/qqIrUbN 我是如何在Markdown文档里插入公式的 时间 2016-08-07 21:05:33 异步社区 原文  h ...

  5. 【建图+最短路】Bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  6. css:id选择器的权重>class选择器的权重=属性选择器的权重>元素选择器

    最近的项目要自己写前端了,重新学习下前端的一下基本知识. 一般在css样式表中,上面的会被下面的覆盖,如下图,文字会显示蓝色: 所以按照正常的来说,下面的css样式,测试的文字应该还是蓝色 但结果,测 ...

  7. mysql事务隔离级别和MVCC

    一.三种问题: 脏读(Drity Read):事务A更新记录但未提交,事务B查询出A未提交记录. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次 ...

  8. Java线程与Linux内核线程的映射关系

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  9. CentOS7系统操作httpd服务 - 开机启动/重启/查看状态

    第一.启动.终止.重启 systemctl start httpd.service #启动 systemctl stop httpd.service #停止 systemctl restart htt ...

  10. ArcGIS API for JavaScript 入门教程[2] 授人以渔

    这篇仍然不讲怎么做,但是我要告诉你如何获取资源. 目录:https://www.cnblogs.com/onsummer/p/9080204.html 转载注明出处,博客园/CSDN/B站:秋意正寒. ...