簡麗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接口的語義。