easyopen 1.0.3 发布,此次更新内容有: 调整文档页面样式 代码优化,完善注释 easyopen的由来 一次偶然的机会了解到淘宝开放平台,比较喜欢它的API调用方式(介绍),京东开放平台也是用此类似方式。它的所有接口只提供一个URL链接,然后通过参数名来区分不同的接口。做过web开发的都知道,一般一个接口url对应后台程序是一个方法,比如springmvc中Controller的一个方法。那么只提供一个url,它是如何来区分具体的哪个方法呢。因为没有看到源码不敢下结论,这里我只想到了两种思路: 第一种方法:服务端做个代理,然后具体请求到对应url 比如客户端请求url是:http://xxx/api/rest?name=goods.get,代理服务器拿到name转发到http://xxx/api/rest/get_goods。也就是说要将goods.get和http://xxx/api/rest/get_goods关联起来。 第二种方法:服务端将goods.get跟方法关联起来 这个怎么关联呢,可以在方法上加一个注解@Api(name="goods.get"),然后服务启动的时候扫描这个类,找到方法,找到方法后就能找到对应@Api注解,拿到name,然后通过一个Map<name,MethodInfo>把他们关联起来。 关联起来后,如何调用呢?客户端请求过来是可以拿到name的,然后通过name找到对应的MethodInfo,就可以进行invoke操作了。整个流程走通之后接着就可以做其它的事情了,比如数字签名验证等功能。 其实这种思想有点类似springmvc的原理,是行得通的。如果用springmvc实现的话,就只有一个Controller,伪代码如下: @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(); // 校验 Object obj = methodInfo.invoke(); // 执行 writeResult(obj); // 返回结果 } easyopen的实现原理就是第二种方法。可以看到这种设计的一个好处是可以做到统一的参数校验,统一的结果返回。开发人员只需要写好service层的代码即可。 easyopen的功能 开箱即用,写完业务代码直接启动服务即可使用,无需其它配置。 参数自动校验,支持国际化参数校验(JSR-303)。 校验功能和结果返回功能实现各自独立,方便自定义实现或扩展。 采用注解来定义接口,维护简单方便。 支持i18n国际化消息返回。 自动生成文档页面,类似swagger。 采用数字签名进行参数验证,签名算法见:easyopen\签名算法.txt。 采用appKey-secret形式接入平台,即需要给接入方提供一个appKey和secret。 更多功能可参考开发文档,在最下方。 结构图 文档页面 文档页面一般提供给客户端,开发人员也可以进行一些简单测试。 easyopen项目托管在了码云: 地址:https://gitee.com/durcframework/easyopen 开发文档:http://durcframework.gitee.io/easyopen easyopen 1.0.3 发布,简单易用的接口平台下载地址