作者:13
GitHub:https://github.com/ZHENFENG13
版权声明:本文为原创文章,未经允许不得转载。

写在前面的话

这个问题看起来就显得有些萌,或者说类似的问题都有些不靠谱,世上哪有那么多一定的事情,做开发都不一定做多久呢,所以说如果你有这个疑问的话是真真有点儿不着调,不过可能也就是随口一问吧,没有深究的必要。既然有人问这个,那么就再用一篇文章谈谈RESTful吧,既然谈,就不能只是谈其优点,也不能一味的吹捧,也讲一下自己的一些理解和不足的地方。

规范、易读、简洁?

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(三)使用ajax方法实现form表单的提交
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(四)RESTful API实战笔记(前端代码修改)
前文中已经谈了RESTful不少的优点,也做了代码更新,首先,REST强调HTTP应当以资源为中心,并且规范了资源URI的风格;规范了HTTP请求动作(PUT,POST等)的使用,具有对应的语义;遵循REST规范的Web应用将会获得下面好处:URL具有很强可读性的,具有自描述性;资源描述与视图的松耦合;可提供OpenAPI,便于第三方系统集成,提高互操作性;如果提供无状态的服务接口,可提高应用的水平扩展性;

总结下来:规范、易读,但是这两个优点也带来一些不尽如人意的"反效果":

  • 因为RESTful规范较为明确且有一定的"强制性",这种限制反而导致设计uri变得复杂了,尤其是复杂的关系,操作,资源集合,硬性套用rest原则设计非常困难。
  • 对于RESTful的争论无处不在,都在讨论正确性和规范性,即使和同事之间也会有类似的争执,当我们在争论Restful风格到底如何设计才是正宗时,发现心中的困惑不仅没有降低,反而增加了。
  • RESTful思想及其所倡导的规范很正确,但是使用者的行为太刻意了反而导致这个东西变了味道,争来争去就是为了证明自己的理解和使用最"正宗"。

RESTful中的模棱两可

前一个段落可能有些过于概念化了,还是举一些具体的例子吧。

案例一

其实,RESTful中也存在着许多的模棱两可,也有很多不是那么让开发人员舒服的地方,有人会去纠结查询、增加、修改、删除(对应的方法就是get、post、put、delete),个人认为这并不完全正确,因为这个想法把开发工作中的业务场景过于简单化和模板化了,我们开发的功能就只实现这四类操作吗、如果遇到一些不能完全对应上这四种方式的业务该怎么办呢?

  • 发短信、支付、用户登录认证,该用get、post、put、delete中的哪一个HTTP动词?
  • login和logout应该怎么REST化?
  • 验证码发送该如何定义uri?

类似的问题还有很多,感觉很多朋友会遇到类似的问题,心里面也有一些不确定该如何去做,其实在理解了REST后,这些并不是什么无解的难题,只是思维方式要转换一下: login和logout其实只是对token或者cookie资源的创建和删除;业务的uri如何选择HTTP动词也要灵活变通,规范是死的,人是活的,按照自己的理解去做,如果后期发现错误即使纠正就好了。不过,虽然API如何编写是开发者的自由,但如果一个API在url里放一堆动词、资源设计混乱、各种乱用HTTP Method和Status Code,就太不像话了,规范嘛还是要遵守的,说了这么多理解上的偏差,其实代码质量才是最重要的,有些手段其实只是让代码看起来比较优雅的手段而已。

案例二

以上是针对于RESTful理解和设计上的一个例子,具体工作中还有其他的例子吗?也是很多的,比如,比较棘手的一个问题:跨域资源共享 CORS。

在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错:

这个问题并不是因为RESTful引起的,也不能通过修改RESTful的规范去解决,举这个例子的原因是因为在接口的RESRful化时也遇到过这个问题,解决办法就不在本文中列举了,有兴趣的朋友可以看一下跨域资源共享 CORS 详解这篇文章,以后有时间会把解决方案整理出来的。

一些需要重视的安全性问题

当然,不止是以上的两个问题,前一个段落主要是讲述了一下理解和具体使用上的问题,这一段讲一下可能引发的安全性问题。

遗漏了对资源从属关系的检查

一个典型的RESTful的URL会用资源名加上资源的id编号来标识其唯一性,就像这样:/users/{userid},例如:/users/100

一般而言用户只能查看自己的用户信息,而不允许查看其它用户的信息。在这种情况下,攻击者很可能会尝试把这个URL里面的USER ID从100修改为其他数值,以期望应用返回指定用户的信息。不过由于这个安全风险太显而易见,绝大多数应用都会对当前请求者的身份进行校验,看其是否是编号为100的用户,校验成功才返回URL中指定的用户信息,否则会拒绝当前请求。

不经意间泄露的业务信息

以查看用户信息的RESTful URL为例:/users/100。由于用户ID是一个按序递增的数字,因此攻击者既可以通过ID知道目前应用中的用户规模,也可以分别在月初和月末的时候注册一个用户,并对比两个用户的ID即可知道当前这个月有多少新增用户。同理,如果订单号也是按序自增的数字,攻击者可以了解到一定时间范围内的订单量。

这类ID并不会给应用造成任何技术上的威胁,只是通过ID泄露出来的信息对于你的业务而言可能非常敏感。解决办法是不使用按序递增的数字作为ID,而是使用具有随机性、唯一性、不可预测性的值作为ID,最常见的做法就是使用UUID。

参考RESTful架构风格下的4大常见安全问题

选择适合自己的方式

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(五)记录一下从懵懂到理解RESTful的过程
前一篇博客中也提到了很多其他的方式,比如传统的MVC开放形式,比如webservice,比如rpc调用,RESTful也只是其中的一种而已,这些选项中并没有高下之分,无非是多种约定俗成的标准,传统MVC开发着舒服就按MVC模式来开发,习惯用RPC就用RPC,能理解和接受REST就用REST。

前几篇文章中描述了RESTful那么多的优点,现在又说大可不必使用,前文又提到RESTful是好的设计实践,现在又是另外一种说法,不是自相矛盾吗?

这是我的文章,我肯定要按照我的一些想法写啊,可能有不对的地方,前文中提到的是好的设计实践也是我的个人想法和理解,这篇的开头就说了,不能只谈优点,所以又列举了一些不足吧,我写文章不是挑口水,很没必要,选择适合自己的技术和规范就好。

套用网络上比较流行的一句话:

听了很多道理却依然过不好一生。

作为一名开发人员,自己动手去实践才是硬道理,别人说什么都不要全盘接受,你要想想适不适合你,适不适合你目前做的项目,鞋合不合适只有脚知道,just do it!

结语

网站的持续运行需要各项基础设施的搭建,而服务期的续费和维护及各种配套服务的购买也需要一定的费用,希望朋友们给予一点支持,谢谢!

支付宝:微信支付:

优点也好,缺点也罢,虽然看似也总结了不少,但都是个人见解,肯定还有一些遗漏的地方没有讲清楚,还请见谅。

回答文章一开始的问题,是不是一定要用呢?是不是一定要遵循其规则呢?如果不能解决你所面对的问题,不能提高和提升代码质量、提升工作效率,其实大可不必如此介怀,不用就是了。

首发于我的个人博客,新的项目演示地址:perfect-ssm,登录账号:admin,密码:123456

如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友,本篇主要讲述了个人对于RESTful的理解。

如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(六)一定要RESTful吗?的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...

  2. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置

    警惕 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作>主要是一个简单的介绍,针对redis ...

  3. 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  4. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API

    写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已经讲述的差不多,也就继续抽时间更新< ...

  5. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(七)一次线上Mysql数据库崩溃事故的记录

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作

    redis简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 简介 这是一篇关于Redis使用的总结类型文章,会先简单的谈一下缓存 ...

  9. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理

    前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...

随机推荐

  1. Mvc检查图片格式后上传

    /// <summary> /// 检查是否文件是否图片并保存 /// </summary> /// <param name="file">文件 ...

  2. 使用 PsPing & PaPing 进行 TCP 端口连通性测试

    PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...

  3. rbac models

    class Permission(models.Model): """ 权限表 """ perm_name = models.CharFie ...

  4. 系统运维|IIS的日志设置

    摘要: 1.服务器告警,磁盘资源不足 2.检查发现是IIS日志没有清理并且设置有误.在E盘占用了200G的空间 3.原则上IIS日志不能放在C盘,避免C盘写满了导致操作系统异常 4.附上IIS日志按天 ...

  5. windwos安装RabbitMQ

    目录 windows 安装RabbitMQ 安装erlang 安装rabbitmq 添加windows环境变量 检测rabbitmq状态 启动web管理插件 rabbitmq服务 windows 安装 ...

  6. Linux 用户名、主机添加背景色

    文章参考:PS1应用之——修改linux终端命令行各字体颜色 Linux 用户名.主机添加背景色,用于生产环境,这样可以减少人为的误操作. [root@zhang ~]# tail /etc/bash ...

  7. Spring boot+ maven + thymeleaf + HTML 实现简单的web项目

    第一步: 创建一个SpringBoot应用 第二步: 创建一个实体,用来存储数据,在src/main/java/com/example/first下创建包entity , 在entity下创建Pers ...

  8. 通过css3,实现加载转动贝塞尔曲线动画

    参考博客:http://blog.jobbole.com/94966/ css代码: .loading { position : relative; display : inline-block; w ...

  9. GUI_鼠标事件

    所有的组件都有鼠标和键盘监听器 import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ja ...

  10. centos7下安装docker(9.3容器对资源的使用限制-Block IO))

    Block IO:指的是磁盘的读写,docker 可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的带宽 注:目前block IO限额只对direct IO(不使用文件缓存)有效. 1.B ...