<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          3行代碼寫出8個接口,開掛了?

          共 7706字,需瀏覽 16分鐘

           ·

          2021-11-04 19:22

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 6?分鐘。

          來自:https://my.oschina.net/tommylemon/blog/1574430

          肯定有不少人會想:這怎么可能呢?
          就算用幾乎零配置的 SpringBoot,寫一個最簡單的接口也得有 3 行代碼啊!

          @RequestMapping("test/{request}")
          public?String?test(@PathVariable?String?request)?{
          ????return?request?+?":?Hello?World";
          }

          那 8 個沒啥用的 Hello World 接口就得 24 行代碼了!
          這還沒算拼 SQL 連 JDBC 或者調(diào)用 ORM 庫 的代碼呢!
          更不用說還要寫 XML 配置 的其它庫了!
          沒錯,用傳統(tǒng)方式就是這樣。
          獲取一個用戶:
          base_url/get/user
          獲取一個用戶列表:
          base_url/get/user/list
          獲取一個評論:
          base_url/get/comment
          獲取一個評論列表:
          base_url/get/comment/list
          ...
          僅僅是查詢,一張表(對應(yīng)客戶端的 model)就要兩個接口了,如果再加上增刪改,批量改批量刪,還有統(tǒng)計,那就得有 8 個接口了!
          那么我是怎么解決的呢?
          同一種類型的請求都只用一個接口:

          增?base_url/post

          刪(包括批量)?base_url/delete

          改(包括批量)?base_url/put

          查(包括列表)?base_url/get

          統(tǒng)計?base_url/head

          用最常用的查詢請求舉例:
          獲取一個用戶:
          base_url/get/
          獲取一個用戶列表:
          base_url/get/
          獲取一個評論:
          base_url/get
          獲取一個評論列表:
          base_url/get
          ...
          都是用同一個接口!我是怎么做到的呢?
          APIJSON,對,就它!
          我們用 APIJSON 來操作一張表,例如用戶表 User,代碼寫 3 行就夠了:

          //注冊表并添加權(quán)限,用默認(rèn)配置
          @MethodAccess
          public?class?User?{
          //內(nèi)容一般僅供表字段說明及 Android App 開發(fā)使用,服務(wù)端不用的可不寫。
          }

          //Verifier?內(nèi)添加權(quán)限
          accessMap.put(User.class.getSimpleName(),?getAccessMap(User.class.getAnnotation(MethodAccess.class)));

          或者可以再定制下 POST 請求的角色權(quán)限:

          @MethodAccess(
          ??POST?=?{UNKNOWN,?ADMIN}?//只允許未登錄角色和管理員角色新增?User,默認(rèn)配置是?{LOGIN,?ADMIN}
          )
          public?class?User?{}

          然后運(yùn)行下 Server 工程就可以請求了:
          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"
          }
          上面只是查了一個 User,如果我們要查女性用戶列表,可以這樣:
          URL:http://apijson.cn:8080/get
          表單:

          {
          ????"[]":?{?//數(shù)組
          ????????"User":?{
          ????????????"sex":?1,?//性別為女
          ????????????"@column":?"id,name"?//只需要id,name這兩個字段
          ????????}
          ????}
          }

          返回:

          {
          ????"[]":?[
          ????????{
          ????????????"User":?{
          ????????????????"id":?82002,
          ????????????????"name":?"Happy~"
          ????????????}
          ????????},
          ????????{
          ????????????"User":?{
          ????????????????"id":?82003,
          ????????????????"name":?"Wechat"
          ????????????}
          ????????},
          ????????{
          ????????????"User":?{
          ????????????????"id":?82005,
          ????????????????"name":?"Jan"
          ????????????}
          ????????}
          ????],
          ????"code":?200,
          ????"msg":?"success"
          }

          User 被多包裹了一層?給數(shù)組命名為 User[] 來去掉吧:
          表單:

          {
          ????"User[]":?{?//提取User
          ????????"User":?{
          ????????????"sex":?1,?//性別為女
          ????????????"@column":?"id,name"?//只需要id,name這兩個字段
          ????????}
          ????}

          返回:

          {
          ????"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這個字段
          ????????}
          ????}
          }

          返回:

          {
          ????"User-name[]":?[
          ????????"Happy~",
          ????????"Wechat",
          ????????"Jan",
          ????????"Meria",
          ????????"Tommy"
          ????],
          ????"code":?200,
          ????"msg":?"success"
          }

          但如果是含多張表關(guān)聯(lián)的數(shù)組,就不要去掉了哦:
          表單:

          {
          ????"[]":?{
          ????????"Comment":?{},?//評論
          ????????"User":?{??????//發(fā)布評論的用戶
          ????????????"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"
          }

          還有動態(tài) Moment 和它的點(diǎn)贊用戶列表:

          {
          ????"Moment":?{},
          ????"User[]":?{
          ????????"User":?{
          ????????????"id{}@":?"Moment/praiseUserIdList"?//id在點(diǎn)贊列表praiseUserIdList內(nèi)
          ????????}
          ????}
          }

          類似微信個人資料界面:

          {
          ????"User":?{},
          ????"Moment[]":?{?//朋友圈照片列表
          ????????"Moment":?{
          ????????????"@order":"date-",?//按發(fā)布時間date倒序排列
          ????????????"userId@":?"User/id"
          ????????}
          ????}
          }

          類似微信朋友圈的動態(tài)列表:

          {
          ????"[]":?{
          ????????"count":?3,?//只要3個
          ????????"page":?2,??//要第2頁的
          ????????"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]????????????????????????????????????//?匹配選項范圍

          "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+"????????????????????????????//?排序方式

          以上都是查詢請求,再試試 增刪改 和 統(tǒng)計 :
          增:?http://apijson.cn:8080/post

          {
          ????"Comment":?{
          ????????"userId":?82001,
          ????????"momentId":?15,
          ????????"content":?"測試新增評論"
          ????},
          ????"tag":?"Comment"
          }

          刪:?http://apijson.cn:8080/delete

          {
          ????"Comment":?{
          ????????"id":?1510394480987
          ????},
          ????"tag":?"Comment"
          }

          改:?http://apijson.cn:8080/put

          {
          ????"Comment":?{
          ????????"id":?22,
          ????????"content":?"測試修改評論"
          ????},
          ????"tag":?"Comment"
          }

          批量刪:?http://apijson.cn:8080/delete

          {
          ????"Comment":?{
          ????????"id{}":?[1510394480987,?1510394804925]
          ????},
          ????"tag":?"Comment[]"
          }

          批量改:?http://apijson.cn:8080/put

          {
          ????"Comment":?{
          ????????"id{}":?[22,?114],
          ????????"content":?"測試批量修改評論"
          ????},
          ????"tag":?"Comment[]"
          }

          統(tǒng)計:?http://apijson.cn:8080/head

          {
          ????"Comment":?{
          ????????"content$":?"%測試%"?//內(nèi)容包含?測試?兩個字
          ????}
          }

          寫操作需要對應(yīng)的權(quán)限,就是用 3 行代碼配置的,請求報錯:
          登錄后角色自動變?yōu)?LOGIN(可傳@role 來自定義),符合 Comment 的 POST 權(quán)限配置,成功:
          回想下,代碼才寫了 3 行,就實現(xiàn)了包括增刪改查等各種操作的 8 個接口以及這么多種查詢!
          事實上用 APIJSON 根本就不用自己寫接口!這 3 行代碼其實是為了做權(quán)限管理!
          像個人博客、非商業(yè)的新聞資訊網(wǎng)站這種可以沒有權(quán)限控制的,
          改下全局配置,不做權(quán)限校驗,那就連一行代碼都不用寫了!!!

          推薦閱讀:

          在 Spring Boot 中,如何干掉 if else

          支付寶員工因績效3.25B被辭退,員工告上法院,結(jié)果來了!

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?

          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天一区二区 | 成人电影大香蕉 | 干欧美视频| 亲子乱一区二区三区视频 | 亚洲qingse中文 |