后端開(kāi)掛:3行代碼 = 8個(gè)接口
今日推薦
肯定有不少人會(huì)想:這怎么可能呢?
就算用幾乎零配置的 SpringBoot,寫(xiě)一個(gè)最簡(jiǎn)單的接口也得有 3 行代碼啊!
@RequestMapping("test/{request}")??
public?String?test(@PathVariable?String?request)?{??
????return?request?+?":?Hello?World";??
}??
那 8 個(gè)沒(méi)啥用的 Hello World 接口就得 24 行代碼了!
這還沒(méi)算拼 SQL 連 JDBC 或者調(diào)用 ORM 庫(kù) 的代碼呢!
更不用說(shuō)還要寫(xiě) XML 配置 的其它庫(kù)了!
沒(méi)錯(cuò),用傳統(tǒng)方式就是這樣。
獲取一個(gè)用戶:
base_url/get/user
獲取一個(gè)用戶列表:
base_url/get/user/list
獲取一個(gè)評(píng)論:
base_url/get/comment
獲取一個(gè)評(píng)論列表:
base_url/get/comment/list
...
僅僅是查詢,一張表(對(duì)應(yīng)客戶端的 model)就要兩個(gè)接口了,如果再加上增刪改,批量改批量刪,還有統(tǒng)計(jì),那就得有 8 個(gè)接口了!
那么我是怎么解決的呢?
同一種類型的請(qǐng)求都只用一個(gè)接口:
增?base_url/post??
??
刪(包括批量)?base_url/delete??
??
改(包括批量)?base_url/put??
??
查(包括列表)?base_url/get??
??
統(tǒng)計(jì)?base_url/head??
用最常用的查詢請(qǐng)求舉例:
獲取一個(gè)用戶:
base_url/get/
獲取一個(gè)用戶列表:
base_url/get/
獲取一個(gè)評(píng)論:
base_url/get
獲取一個(gè)評(píng)論列表:
base_url/get
...
都是用同一個(gè)接口!我是怎么做到的呢?

APIJSON,對(duì),就它!
我們用 APIJSON 來(lái)操作一張表,例如用戶表 User,代碼寫(xiě) 3 行就夠了:
//注冊(cè)表并添加權(quán)限,用默認(rèn)配置??
@MethodAccess??
public?class?User?{??
//內(nèi)容一般僅供表字段說(shuō)明及 Android App 開(kāi)發(fā)使用,服務(wù)端不用的可不寫(xiě)。??
}??
??
//Verifier?內(nèi)添加權(quán)限??
accessMap.put(User.class.getSimpleName(),?getAccessMap(User.class.getAnnotation(MethodAccess.class)));??
或者可以再定制下 POST 請(qǐng)求的角色權(quán)限:
@MethodAccess(??
??POST?=?{UNKNOWN,?ADMIN}?//只允許未登錄角色和管理員角色新增?User,默認(rèn)配置是?{LOGIN,?ADMIN}??
)??
public?class?User?{}??
然后運(yùn)行下 Server 工程就可以請(qǐng)求了:
URL:http://apijson.cn:8080/get
表單:
{??
????"User":?{??
????????"id":?82001??
????}??
}???
返回:
{??
????"User":?{??
????????"id":?82001,??
????????"sex":?0,??
????????"name":?"Test",??
????????"tag":?"APIJSON?User",??
????????"head":?"http://static.oschina.net/uploads/user/19/39085_50.jpg",??
????????"contactIdList":?[??
????????????82004,??
????????????82021,??
????????????70793??
????????],??
????????"pictureList":?[??
????????????"http://common.cnblogs.com/images/icon_weibo_24.png"??
????????],??
????????"date":?"2017-02-01?19:21:50.0"??
????},??
????"code":?200,??
????"msg":?"success"??
}??
上面只是查了一個(gè) User,如果我們要查女性用戶列表,可以這樣:
URL:http://apijson.cn:8080/get
表單:
{??
????"[]":?{?//數(shù)組??
????????"User":?{??
????????????"sex":?1,?//性別為女??
????????????"@column":?"id,name"?//只需要id,name這兩個(gè)字段??
????????}??
????}??
}??
返回:
{??
????"[]":?[??
????????{??
????????????"User":?{??
????????????????"id":?82002,??
????????????????"name":?"Happy~"??
????????????}??
????????},??
????????{??
????????????"User":?{??
????????????????"id":?82003,??
????????????????"name":?"Wechat"??
????????????}??
????????},??
????????{??
????????????"User":?{??
????????????????"id":?82005,??
????????????????"name":?"Jan"??
????????????}??
????????}??
????],??
????"code":?200,??
????"msg":?"success"??
}??
User 被多包裹了一層?給數(shù)組命名為 User[] 來(lái)去掉吧:
表單:
{??
????"User[]":?{?//提取User??
????????"User":?{??
????????????"sex":?1,?//性別為女??
????????????"@column":?"id,name"?//只需要id,name這兩個(gè)字段??
????????}??
????}??
返回:
{??
????"User[]":?[??
????????{??
????????????"id":?82002,??
????????????"name":?"Happy~"??
????????},??
????????{??
????????????"id":?82003,??
????????????"name":?"Wechat"??
????????},??
????????{??
????????????"id":?82005,??
????????????"name":?"Jan"??
????????}??
????],??
????"code":?200,??
????"msg":?"success"??
}??
還要進(jìn)一步提取名字?User-name[] 滿足你:
表單:
{??
????"User-name[]":?{?//提取User.name??
????????"User":?{??
????????????"sex":?1,?//性別為女??
????????????"@column":?"name"?//只需要name這個(gè)字段??
????????}??
????}??
}??
返回:
{??
????"User-name[]":?[??
????????"Happy~",??
????????"Wechat",??
????????"Jan",??
????????"Meria",??
????????"Tommy"??
????],??
????"code":?200,??
????"msg":?"success"??
}??
但如果是含多張表關(guān)聯(lián)的數(shù)組,就不要去掉了哦:
表單:
{??
????"[]":?{??
????????"Comment":?{},?//評(píng)論??
????????"User":?{??????//發(fā)布評(píng)論的用戶??
????????????"id@":?"/Comment/userId"?//User.id?=?Comment.userId??
????????}??
????}??
}??
返回:
{??
????"[]":?[??
????????{??
????????????"Comment":?{??
????????????????"id":?3,??
????????????????"toId":?0,??
????????????????"userId":?82002,??
????????????????"momentId":?15,??
????????????????"date":?"2017-02-01?19:20:50.0",??
????????????????"content":?"This?is?a?Content...-3"??
????????????},??
????????????"User":?{??
????????????????"id":?82002,??
????????????????"sex":?1,??
????????????????"name":?"Happy~",??
????????????????"tag":?"iOS",??
????????????????"head":?"http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000",??
????????????????"contactIdList":?[??
????????????????????82005,??
????????????????????82001,??
????????????????????38710??
????????????????],??
????????????????"pictureList":?[],??
????????????????"date":?"2017-02-01?19:21:50.0"??
????????????}??
????????},??
????????{??
????????????"Comment":?{??
????????????????"id":?4,??
????????????????"toId":?0,??
????????????????"userId":?38710,??
????????????????"momentId":?470,??
????????????????"date":?"2017-02-01?19:20:50.0",??
????????????????"content":?"This?is?a?Content...-4"??
????????????},??
????????????"User":?{??
????????????????"id":?38710,??
????????????????"sex":?0,??
????????????????"name":?"TommyLemon",??
????????????????"tag":?"Android&Java",??
????????????????"head":?"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",??
????????????????"contactIdList":?[??
????????????????????82003,??
????????????????????82005??
????????????????],??
????????????????"pictureList":?[??
????????????????????"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",??
????????????????????"http://common.cnblogs.com/images/icon_weibo_24.png"??
????????????????],??
????????????????"date":?"2017-02-01?19:21:50.0"??
????????????}??
????????}??
????],??
????"code":?200,??
????"msg":?"success"??
}??
還有動(dòng)態(tài) Moment 和它的點(diǎn)贊用戶列表:
{??
????"Moment":?{},??
????"User[]":?{??
????????"User":?{??
????????????"id{}@":?"Moment/praiseUserIdList"?//id在點(diǎn)贊列表praiseUserIdList內(nèi)??
????????}??
????}??
}??
類似微信個(gè)人資料界面:
{??
????"User":?{},??
????"Moment[]":?{?//朋友圈照片列表??
????????"Moment":?{??
????????????"@order":"date-",?//按發(fā)布時(shí)間date倒序排列??
????????????"userId@":?"User/id"??
????????}??
????}??
}??
類似微信朋友圈的動(dòng)態(tài)列表:
{??
????"[]":?{??
????????"count":?3,?//只要3個(gè)??
????????"page":?2,??//要第2頁(yè)的??
????????"Moment":?{},??
????????"User":?{??
????????????"id@":?"/Moment/userId"??
????????},??
????????"Comment[]":?{??
????????????"Comment":?{??
????????????????"momentId@":?"[]/Moment/id"??
????????????}??
????????}??
????}??
}???
...
任意結(jié)構(gòu),任意內(nèi)容,任意組合,
想要什么 JSON 結(jié)構(gòu)、字段內(nèi)容、表關(guān)聯(lián)組合查詢都可以完全自定義!
"key[]":{}?????????????????????????????????????????//?查詢數(shù)組??
??
"key{}":[1,2,3]????????????????????????????????????//?匹配選項(xiàng)范圍??
??
"key{}":"<=10,length(key)>1..."????????????????????//?匹配條件范圍??
??
"key()":"function(arg0,arg1...)"???????????????????//?遠(yuǎn)程調(diào)用函數(shù)??
??
"key@":"key0/key1.../targetKey"????????????????????//?引用賦值??
??
"key$":"%abc%"?????????????????????????????????????//?模糊搜索??
??
"key?":"^[0-9]+$"??????????????????????????????????//?正則匹配??
??
"key+":[1]?????????????????????????????????????????//?增加/擴(kuò)展??
??
"key-":888.88?????????????????????????????????????//?減少/去除???
??
"name:alias"??????????????????????????????????????//?新建別名??
??
"@column":"id,sex,name"???????????????????????????//?返回字段??
??
"@group":"userId"?????????????????????????????????//?分組方式??
??
"@having":"max(id)>=100"??????????????????????????//?聚合函數(shù)??
??
"@order":"date-,name+"????????????????????????????//?排序方式??

以上都是查詢請(qǐng)求,再試試 增刪改 和 統(tǒng)計(jì) :
增:?http://apijson.cn:8080/post
{??
????"Comment":?{??
????????"userId":?82001,??
????????"momentId":?15,??
????????"content":?"測(cè)試新增評(píng)論"??
????},??
????"tag":?"Comment"??
}??
刪:?http://apijson.cn:8080/delete
{??
????"Comment":?{??
????????"id":?1510394480987??
????},??
????"tag":?"Comment"??
}??
改:?http://apijson.cn:8080/put
{??
????"Comment":?{??
????????"id":?22,??
????????"content":?"測(cè)試修改評(píng)論"??
????},??
????"tag":?"Comment"??
}??
批量刪:?http://apijson.cn:8080/delete
{??
????"Comment":?{??
????????"id{}":?[1510394480987,?1510394804925]??
????},??
????"tag":?"Comment[]"??
}??
批量改:?http://apijson.cn:8080/put
{??
????"Comment":?{??
????????"id{}":?[22,?114],??
????????"content":?"測(cè)試批量修改評(píng)論"??
????},??
????"tag":?"Comment[]"??
}??
統(tǒng)計(jì):?http://apijson.cn:8080/head
{??
????"Comment":?{??
????????"content$":?"%測(cè)試%"?//內(nèi)容包含?測(cè)試?兩個(gè)字??
????}??
}??
寫(xiě)操作需要對(duì)應(yīng)的權(quán)限,就是用 3 行代碼配置的,請(qǐng)求報(bào)錯(cuò):

登錄后角色自動(dòng)變?yōu)?LOGIN(可傳@role 來(lái)自定義),符合 Comment 的 POST 權(quán)限配置,成功:

回想下,代碼才寫(xiě)了 3 行,就實(shí)現(xiàn)了包括增刪改查等各種操作的 8 個(gè)接口以及這么多種查詢!
事實(shí)上用 APIJSON 根本就不用自己寫(xiě)接口!這 3 行代碼其實(shí)是為了做權(quán)限管理!
像個(gè)人博客、非商業(yè)的新聞資訊網(wǎng)站這種可以沒(méi)有權(quán)限控制的,
改下全局配置,不做權(quán)限校驗(yàn),那就連一行代碼都不用寫(xiě)了?。?!

來(lái)源:my.oschina.net/tommylemon/blog/1574430
推薦文章
1、一款高顏值的 SpringBoot+JPA 博客項(xiàng)目 2、超優(yōu) Vue+Element+Spring 中后端解決方案 3、推薦幾個(gè)支付項(xiàng)目! 4、推薦一個(gè) Java 企業(yè)信息化系統(tǒng) 5、一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問(wèn)答/社交網(wǎng)絡(luò)/博客)
