先简单介绍下easyopen,一个简单易用的接口开放平台,平台封装了常用的参数校验、结果返回等功能,开发者只需实现业务代码即可。详情前往:easyopen码云
一般我们提供给前端接口采用用springmvc接口方式。如果要增加一个接口,大致步骤如下
如果再增加一个接口,依旧是执行者6个步骤,久而久之我对此感到厌烦。通过观察整个Controller中的代码我们可以发现,除了第4步业务代码不一样,其它步骤基本一致。我们可以把相同的东西提取出来,即1,2,3,5,6只写一次,然后我们只写业务代码。这里有同学可能会问,只写一个Controller方法,那你的URL是多个的,怎么定义呢。是的,URL之定义一个,我们可以通过参数来指定具体是要调用那个业务类。
比如我接口中添加一个参数name,如果name="goods.add",那么就调用service.addGoods(param)方法。goods.add又是怎么跟service.addGoods(param)方法对应起来的呢?我可以在addGoods()方法上面加一个注解@Api(name="goods.add")里面有个name属性。在服务器启动时,扫描Service类中的所有方法,如果发现有@Api注解,就把它缓存起来,可以用一个map来保存他们Map<String,Object> map ... key对应name,value对应addGoods方法信息。然后就是等待请求的到来。通过name找到对应的方法,然后调用method.invoke()方法。在调用method.invoke()前做第3步,执行完后做第5,6步。这里的invoke也就是第4步了。
伪代码如下:
@RequestMapping(method = RequestMethod.POST)
public void index(HttpServletRequest request, HttpServletResponse response) throws Throwable {
String name = request.getParameter("name");
MethodInfo methodInfo = map.get(name);
Param param = methodInfo.getParam();
param.validate(); // 3
Object obj = methodInfo.invoke(); // 4
writeResult(obj); // 5,6
}
这个Controller写一次就行了,然后我们就写各自的Service。其它功能可以在此基础上进行扩展。比如请求参数验签,文档自动生成,国际化设置。
这样我们提供给客户端只有一个url,对前端同学来说,它们的请求代码可以做一层封装,伪代码如下:
function post(name,data,callback) {
var postDataStr = ...
jQuery.ajax({
url:'api',
type:'post',
dataType:'json',
contentType: "application/json;charset=utf-8",
data:postDataStr,
success:function(data){
callback(data,postDataStr);
}
});
}
本文中提到的所有功能在easyopen上都已经实现,感兴趣的同学可以下载源码来查看。