简丽Framework-开篇
简丽Framework-开篇
简丽Framework 是一个开源java Web开发框架。
演示环境
http://jianli.hzbailing.cn/
admin
123456
开源地址
https://github.com/jikanghz/jianli
开源的框架、库、组件等比比皆是,每个开源产品都有它的定位和价值。
简丽Framework的定位是中小型Web项目的主体开发框架,它包含了对设计理念、开发规范、基础模块的理解和实践。
数据本无形
Web系统主要处理的就是数据和业务逻辑。一般来说数据的存储结构相对稳定,映射到代码中的数据对象也相对稳定。
但是数据的中间处理过程往往是复杂、多变的,为此就有了设计模式和开发手册上提到的DTO、VO对象。在实际开发过程中使用DTO,VO对象会有一系列令人纠结的问题:我要不要再增加一个DTO?对新增加的DTO我该取什么名字?前端又在报怨后端VO对象返回的数据字段过多了...
用静态、强类型语言来表达千变万化的数据本来就是勉为其难的事情。好在我们现在有json这样的动态弱类型数据对象,让结构化数据的表达和传递变得轻盈,从此告别了笨重的DTO、VO们。
用动态弱类型数据对象可能有什么问题?我们失去了编译器的帮助,代码重构将只能手动进行。得失与取舍需要自己来衡量。
方法亦多态
多态性通常指在运行时决定调用子类的具体方法。但其实Web系统的业务领域用到继承的场景并不多(硬要为每个Service写一个接口的场景除外 😃 ),所以多态性也显得少有用武之地。
我们把多态的概念扩展一下,变成运行时调用指定对象的指定方法如何?
通过Spring容器可以得到指定对象,通过反射来调用指定方法。
似乎变得有些扑朔迷离了,这样做有什么好处?
好处就是在Controller层可以用一个接口实现对所有服务的调用。这样Controller层几乎可以用一个通用方法来接管全部接口了。在这个通用方法里可以实现统一的异常处理、日志记录、计时器等。
BaseService service = (BaseService) getServiceFactory().getBean(serviceName);
Class serviceClass = service.getClass();
Method method = serviceClass.getMethod(methodName, JsonRequest.class);
jsonResponse = (JsonResponse) method.invoke(service, new Object[]{jsonRequest});
Web接口规范
Web接口Url
http://domain/api/{service}/{method}
以上是所有Web接口Url的统一格式,包含了服务名称、方法名称两个参数。与面向对象的对象名和方法名类似,是每个Web接口的语义描述。
接口请求数据
{
"token": "",
"client": "",
"data": {}
}
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
token | String | 是 | 接口令牌 客户端登录成功后得到token,以后每次调用接口都要带上token |
client | String | 是 | 客户端标识 |
data | Json | 否 | 请求业务数据 |
接口响应数据
{
"code": 200,
"message": "OK",
"data": {}
}
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
code | Integer | 是 | 响应代码 200:成功 400:请求参数错误 401:身份验证失败 403:授权验证失败 500:未知服务器内部错误 501:已知服务器内部错误 |
message | String | 是 | 响应消息内容 |
data | Json | 否 | 响应业务数据 |
可以看这个接口规范并没有遵循RESTful接口规范,个人认为RESTful接口规范太桎梏于http协议,不足于表达api接口的语义。