3 行代码写出 8 个接口,开挂了?网友:绝对不可能!!!-程序员宅基地

技术标签: python  接口  java  web  mysql  

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方留言必回,有问必答!

每天 08:35 更新文章,每天进步一点点...

肯定有不少人会想:这怎么可能呢?

就算用几乎零配置的 SpringBoot,写一个最简单的接口也得有 3 行代码啊!

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

那 8 个没啥用的 Hello World 接口就得 24 行代码了!

这还没算拼 SQL 连 JDBC 或者调用 ORM 库 的代码呢!

更不用说还要写 XML 配置 的其它库了!

没错,用传统方式就是这样。

获取一个用户:

base_url/get/user

获取一个用户列表:

base_url/get/user/list

获取一个评论:

base_url/get/comment

获取一个评论列表:

base_url/get/comment/list

...

仅仅是查询,一张表(对应客户端的 model)就要两个接口了,如果再加上增删改,批量改批量删,还有统计,那就得有 8 个接口了!

那么我是怎么解决的呢?

同一种类型的请求都只用一个接口:

增 base_url/post

删(包括批量) base_url/delete

改(包括批量) base_url/put

查(包括列表) base_url/get

统计 base_url/head

用最常用的查询请求举例:

获取一个用户:

base_url/get/

获取一个用户列表:

base_url/get/

获取一个评论:

base_url/get

获取一个评论列表:

base_url/get

...

都是用同一个接口!我是怎么做到的呢?

ac0ae0f0a526fe8344875240c68cc92f.png

APIJSON,对,就它!

我们用 APIJSON 来操作一张表,例如用户表 User,代码写 3 行就够了:

//注册表并添加权限,用默认配置
@MethodAccess
public class User {
//内容一般仅供表字段说明及 Android App 开发使用,服务端不用的可不写。
}

//Verifier 内添加权限
accessMap.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class)));

或者可以再定制下 POST 请求的角色权限:

@MethodAccess(
  POST = {UNKNOWN, ADMIN} //只允许未登录角色和管理员角色新增 User,默认配置是 {LOGIN, ADMIN}
)
public class User {}

然后运行下 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

表单:

{
    "[]": { //数组
        "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 被多包裹了一层?给数组命名为 User[] 来去掉吧:

推荐:Java进阶学习资料

表单:

{
    "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"
}

还要进一步提取名字?User-name[] 满足你:

表单:

{
    "User-name[]": { //提取User.name
        "User": {
            "sex": 1, //性别为女
            "@column": "name" //只需要name这个字段
        }
    }
}

返回:

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

但如果是含多张表关联的数组,就不要去掉了哦:

表单:

{
    "[]": {
        "Comment": {}, //评论
        "User": {      //发布评论的用户
            "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"
}

还有动态 Moment 和它的点赞用户列表:

{
    "Moment": {},
    "User[]": {
        "User": {
            "id{}@": "Moment/praiseUserIdList" //id在点赞列表praiseUserIdList内
        }
    }
}

类似微信个人资料界面:

{
    "User": {},
    "Moment[]": { //朋友圈照片列表
        "Moment": {
            "@order":"date-", //按发布时间date倒序排列
            "userId@": "User/id"
        }
    }
}

类似微信朋友圈的动态列表:

{
    "[]": {
        "count": 3, //只要3个
        "page": 2,  //要第2页的
        "Moment": {},
        "User": {
            "id@": "/Moment/userId"
        },
        "Comment[]": {
            "Comment": {
                "momentId@": "[]/Moment/id"
            }
        }
    }
}

...

任意结构,任意内容,任意组合,推荐:Java进阶学习资料

想要什么 JSON 结构、字段内容、表关联组合查询都可以完全自定义!

"key[]":{}                                         // 查询数组

"key{}":[1,2,3]                                    // 匹配选项范围

"key{}":"<=10,length(key)>1..."                    // 匹配条件范围

"key()":"function(arg0,arg1...)"                   // 远程调用函数

"key@":"key0/key1.../targetKey"                    // 引用赋值

"key$":"%abc%"                                     // 模糊搜索

"key?":"^[0-9]+$"                                  // 正则匹配

"key+":[1]                                         // 增加/扩展

"key-":888.88                                     // 减少/去除 

"name:alias"                                      // 新建别名

"@column":"id,sex,name"                           // 返回字段

"@group":"userId"                                 // 分组方式

"@having":"max(id)>=100"                          // 聚合函数

"@order":"date-,name+"                            // 排序方式
9d3a8f6de4e9322be3730aea5eb834b8.png

以上都是查询请求,再试试 增删改 和 统计 :

增: 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[]"
}

统计: http://apijson.cn:8080/head

{
    "Comment": {
        "content$": "%测试%" //内容包含 测试 两个字
    }
}

写操作需要对应的权限,就是用 3 行代码配置的,请求报错:

0022eb4461c7d5466a8eca7cbf4d936c.png

登录后角色自动变为 LOGIN(可传@role 来自定义),符合 Comment 的 POST 权限配置,成功:

b46425047199e4e025654ed97082e2b3.png

回想下,代码才写了 3 行,就实现了包括增删改查等各种操作的 8 个接口以及这么多种查询!

事实上用 APIJSON 根本就不用自己写接口!这 3 行代码其实是为了做权限管理!

像个人博客、非商业的新闻资讯网站这种可以没有权限控制的,

改下全局配置,不做权限校验,那就连一行代码都不用写了!!!

作者:孤独的探索号

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

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END -------

精品资料,超赞福利!

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

☆ Java进阶学习资料
 Java自学、进阶路线图免费领

d6c8d885bba744c0f141b67f4e99fd63.png

877d1cdadce41a1d65c964af852d11c4.png

期往精选  点击标题可跳转

要嫁就嫁程序“猿”,看看别人家的 1024 程序员节!网友:酸了。。。

雷军做程序员时写的博客,真的很强大!

别再用 Date 了,死磕 Java8 新特性,18 种日期处理方式!

知乎34W+,能跑的代码就不能动?!正要动,就被人打了...

技术圈热议:阿里 GitHub 项目被爆 "刷 Star"!这波又摊上事了...

谁再说不熟悉 Linux 命令,就把这个给他扔过去!

还在付费使用 XShell?我选择这款国产良心工具,完全免费!

IDEA 这个小技巧太实用了!随时随用。。。

文章有帮助的话,在看,转发吧!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/afreon/article/details/121134265

智能推荐

d3.csv()读取本地文件失败_报错Access to XMLHttpRequest at ‘file:‘ from origin ‘null‘ has been blocked_替换和解决方法_from origin 'null' has been blocked by cors policy-程序员宅基地

文章浏览阅读4.2k次,点赞8次,收藏13次。背景介绍:最近在做一个数据可视化系统,对csv文件中数据进行处理后,以统计图表的形式实现可视化,使用的技术有JavaScript、D3、HTML。由于D3提供了csv文件读取函数——d3.csv(),本想直接使用,但在运行系统的时候报出以下两个错误:Access to XMLHttpRequest at ‘file://’ from origin ‘null’ has beenblocked by CORS policy: Cross origin requests are only suppor_from origin 'null' has been blocked by cors policy: cross origin requests ar

【diffusers】(三) pipeline原理及自定义训练推理-程序员宅基地

文章浏览阅读1.7k次,点赞20次,收藏29次。上一篇文章中我们介绍了SD以及scheduler,深入了解了diffusers中代码和论文公式中的相对关系。现在我们就要开始实战,看看怎么去训练和推理自己的模型。

nodejs+vue+python+PHP音乐网站的设计与实现-毕业设计推荐-微信小程序_node vue开发网站-程序员宅基地

文章浏览阅读61次。音乐网站改变了传统音乐产业的产业结构。而现在许多音乐网站不能提供在线播放,并且在技术支持上也不完善。而音乐站点的设计和优化,就是从音乐的角度出发,利用 Web服务器来对其进行功能的设计,以此实现音乐网站的应用水平提升。_node vue开发网站

维护顺序统计树中结点秩信息的策略与实践-程序员宅基地

文章浏览阅读819次,点赞29次,收藏16次。本文旨在深入探讨顺序统计树中结点秩信息的维护机制,特别是在插入和删除操作中如何保持这一关键信息的准确性。我们将详细分析插入和删除过程中的每个步骤,探讨如何在不影响红黑树操作渐近性能的前提下,有效地维护结点的秩信息。通过本文的阐述,读者将能够更好地理解顺序统计树的工作原理,以及如何在实际应用中高效地利用这一数据结构。

C# Modbus TCP上位机测试_modbus 测试 上位机-程序员宅基地

文章浏览阅读913次。前面说了三菱和西门子PLC的上位机通信,实际在生产应用中,设备会有很多不同的厂家生产的PLC,那么,我们就需要一种通用的语言,进行设备之间的通信,工业上较为广泛使用的语言之一就是Modbus。Modbus有多种连接方式,如串口(RTU)、以太网(TCP/IP),今天我们讲的是TCP,也就是插网线的方式。首先,我们安装从机的仿真,上位机软件作为主机。从机仿真可以用Modbus Slave这个软件。_modbus 测试 上位机

java毕业生设计宠物领养管理系统计算机源码+系统+mysql+调试部署+lw_宠物管理系统mysql源码-程序员宅基地

文章浏览阅读55次。java毕业生设计宠物领养管理系统计算机源码+系统+mysql+调试部署+lw。springboot学生心理健康信息咨询系统。springboot“西单”甜品线上预定系统。springboot高校教师科研成果管理系统。springboot师生共评的作业管理系统。springboot扶贫助农与产品合作系统。springboot京津冀景区网上导游系统。springboot个性化产品服务管理系统。springboot中医药院校科研会议系统。springboot中小企业设备管理系统。_宠物管理系统mysql源码

随便推点

新唐 Nuvoton M031 入门 点亮板载LED_新唐 m031seriesbsp_v1.5 2017-程序员宅基地

文章浏览阅读2.4k次。官网地址http://www.nuvoton.com.cn/board/numaker-m031tc/http://www.nuvoton.com.cn/products/microcontrollers/arm-cortex-m0-mcus/m031-series/m031tb0ae/资源下载地址http://www.nuvoton.com.cn/products/microcontrollers/arm-cortex-m0-mcus/m031-series/m031tb0ae/?gr_新唐 m031seriesbsp_v1.5 2017

论文笔记:Hypergraph Convolution and Hypergraph Attention-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏13次。前言论文链接:https://arxiv.org/abs/1901.081501. Hypergraph Convolution and Hypergraph Attention1.1 Hypergraph Revisited一个普通图定义为 G=(V,E)\mathcal{G}=(V,E)G=(V,E) ,其中节点集定义为 V={v1,v2,…,vN}V=\{v_1,v_2,\dots,v_N\}V={v1​,v2​,…,vN​},边集定义为 E⊆V×VE \subseteq V \times V_hypergraph convolution and hypergraph attention

三个绘图工具类详解Paint(画笔)Canvas(画布)Path(路径)_setstrokecap-程序员宅基地

文章浏览阅读2.5k次。drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint): 画弧,参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电 弧,参数二是起始角 (度)在电弧的开始,参数三扫描角(度)开始顺时针测量的,参数四是如果 这是真的话,包括椭圆中心的电 弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象;..._setstrokecap

ARM处理器工作模式_操作系统内核通常处于()模式-程序员宅基地

文章浏览阅读2.8k次,点赞5次,收藏10次。一、ARM体系的CPU有以下7种工作模式:1、用户模式(usr):正常的程序执行状态2、快速中断模式(fiq):3、中断模式(irq):4、管理模式(svc):操作系统使用的保护模式5、系统模式(sys):运行具有特权的操作系统任务6、数据访问终止模式(abt):数据或指令预取终止时进入该模式7、未定义指令终止模式(und):未定义的指令执行时进入该模式_操作系统内核通常处于()模式

CSAPP lab2 二进制拆弹 binary bombs phase_4-程序员宅基地

文章浏览阅读566次。给出对应于7个阶段的7篇博客phase_1 https://www.cnblogs.com/wkfvawl/p/10632044.htmlphase_2 https://www.cnblogs.com/wkfvawl/p/10636214.htmlphase_3 https://www.cnblogs.com/wkfvawl/p/10651205.htmlphase_4 ht...

java newtonsoft.json_(转载)Newtonsoft.Json使用总结-程序员宅基地

文章浏览阅读749次。初识JSON.........................................................................................................................................2在ASP.NET中使用JSON............................................_java 能用newtonsoft.json吗

推荐文章

热门文章

相关标签