easyopen设计初衷

先简单介绍下easyopen,一个简单易用的接口开放平台,平台封装了常用的参数校验、结果返回等功能,开发者只需实现业务代码即可。详情前往:easyopen码云

一般我们提供给前端接口采用用springmvc接口方式。如果要增加一个接口,大致步骤如下

  1. 添加一个Controller,打上@Controller注解
  2. 添加一个方法,打上@RequestMapping,定义URL,参数等信息
  3. 参数校验
  4. 在Service中写业务代码
  5. 返回结果给Controller
  6. Controller返回,转换成json

如果再增加一个接口,依旧是执行者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上都已经实现,感兴趣的同学可以下载源码来查看。

猜你喜欢

转载自my.oschina.net/u/3658366/blog/1621323
今日推荐