摘要:因此,误解几乎是与之俱来的。这是完全错误的。就像所强调的,对于一个被称作的来说,状态转移管理是一个必须要完成的需求。你可以将其称为或是,但是请不要把它叫做。
2000年的时候,Douglas Crockford声明JavaScript是最被误解的编程语言。这种误解来源于不良的命名规范,错误设计,非标准模式等等。因此,误解几乎是与之俱来的。
我也在关于Restful架构上发表了一个相似的意见:REST是世界上被误解最严重的架构模式。
事实上,大多人认为,创建一个RESTful API只需要基于URL和HTTP动词。这是完全错误的。
这个误解存在太久了。但是和JavaScript不同,REST规范讲述的非常清晰。它的命名本身就强调了状态的转化,但是这个概念却是所谓的RESTful API设计者们所最为忽视的。
如果你随便问十个开发者,他们的API是否支持HATEOAS,至少九个人会睁大双眼回答:你到底在说啥?
REST名字本身已经解释的很清楚了。REST并没有指定使用的协议以及如何标记一个资源。它强调的是表现层状态转移。就像Roy Fielding所强调的,对于一个被称作RESTful的API来说,状态转移管理是一个必须要完成的需求。
一个真正的RESTful API会提供给客户端一个新的状态,以及切换到后序状态的方法。它提供了资源的表示(不一定用JSON的形式)和指向别的资源的富链接,如下所示:
{ "id": 463219, "firstName": "John", "lastName": "Smith", "company": "Acme Inc.", "salary": 72500, "links": [ { "href": "https://api.myapp.com/employees/employee/463219", "rel": "self" }, { "href": "https://api.myapp.com/companies/company/375", "rel": "company" }, { "href": "https://api.myapp.com/payments/employee/463219", "rel": "payments" } ] }
这里的资源进行自我描述之后,提供了相关资源的链接。
不管你是使用HTTP协议还是其它的,REST方法的关键点在于由服务器进行客户状态的转化。客户端的状态几乎完全是由服务器进行转化的。因此,API的版本也有其存在的意义。客户对于RESTful接口的了解仅限于入口点。其它的应该从解析服务器的响应来获取。这个场景很少有应用能够实现。
单纯的根据HTTP动词进行CRUD操作的API和状态转换没有任何关系。你可以将其称为WEB API或是HTTP API,但是请不要把它叫做RESTful。
词汇补充
HATEOAS: Hypermedia As The Engine Of Application State
客户端和服务端完全通过超媒体进行交互。REST客户端只需要对超媒体有一定的了解,无需知道别的信息。
REST客户端从一个简单且固定的URL进入REST应用。客户端之后所做的任何操作都通过服务器返回的资源决定。
比如,你发出这样一个HTTP请求,试图获取账号为12345的信息:
GET /accounts/12345 HTTP/1.1 Host: bank.example.com Accept: application/xml ...
得到的响应是一个XML形式的信息如下:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: ...12345 100.00
这个响应包含了所有可能的状态转化连接,如存款,取款,转账或是关闭账户
当检索到该账户透支时,会返回如下信息:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: ...12345 -25.00
现在只剩下一个可用链接:存钱。其它的链接都将不可用。
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68638.html
摘要:无需检查的异常也是的子类。从低层抛出的需检查异常强制要求调用方捕获或是抛出该异常。当前执行的线程将会停止并报告该异常。单元测试允许我在使用中查看异常,并且作为一个可以被执行的文档来使用。不要捕获最高层异常继承的异常同样是的子类。 前言 异常处理的问题之一是知道何时以及如何去使用它。我会讨论一些异常处理的最佳实践,也会总结最近在异常处理上的一些争论。 作为程序员,我们想要写高质量的能够解...
摘要:这个例子想要说明两个事情中以为结尾的方法将会异步执行默认情况下即指没有传入的情况下,异步执行会使用实现,该线程池使用一个后台线程来执行任务。这个例子展示了如何使用一个固定大小的线程池来实现大写操作。 前言 这篇博客回顾JAVA8的CompletionStageAPI以及其在JAVA库中的标准实现CompletableFuture。将会通过几个例子来展示API的各种行为。 因为Compl...
摘要:什么是仿射变换一组设备无关的坐标被用来将所有的坐标信息传递给对象。对象作为对象状态的一部分。类代表一个的仿射变化,将一组的坐标进行线性映射到另一组保留了平行关系和竖直关系的坐标中。 什么是仿射变换 一组设备无关的坐标被用来将所有的坐标信息传递给Graphics2D对象。AffineTransform对象作为Graphics2D对象状态的一部分。该对象定义了如何将用户空间的坐标转化为设备...
摘要:是指可能导致程序终止的非常严重的时间。具有最高的级别,旨在关闭中的日志功能。因此为每一个消息选择一个合适的日志级别是非常重要的。日志的个小建议将日志访日代码块它能显著的减少因为字符串拼接而带来的性能的影响。 前言 首先,这篇文章没有进行任何的日志功能的详细介绍,而是对日志提出了几种最佳实践。适合对日志记录有所了解的同学阅读。下面是正文: JAVA日志管理既是一门科学,又是一门艺术。科学...
摘要:前言上一篇文章请参考猫头鹰的深夜翻译核心并发一安全发布发布一个对象是指该对象的引用对当前的域之外也可见比如,从方法中获取一个引用。任务的功能性接口表示一个没有返回值的任务表示一个包含返回值的计算。 前言 上一篇文章请参考猫头鹰的深夜翻译:核心JAVA并发(一) 安全发布 发布一个对象是指该对象的引用对当前的域之外也可见(比如,从getter方法中获取一个引用)。要确保一个对象被安全的发...
阅读 1638·2021-09-26 09:55
阅读 5188·2021-09-22 15:40
阅读 1984·2019-08-30 15:53
阅读 1478·2019-08-30 11:15
阅读 1695·2019-08-29 15:41
阅读 1824·2019-08-28 18:13
阅读 3118·2019-08-26 12:00
阅读 1647·2019-08-26 10:30