- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天早上我在 REST 上读了一些书,发现了 HATEOAS principle ("hypermedia as the engine of application state") .
Clients make state transitions only through actions that are dynamically identified within hypermedia by the server (e.g. by hyperlinks within hypertext). Except for simple fixed entry points to the application, a client does not assume that any particular actions will be available for any particular resources beyond those described in representations previously received from the server.
...if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period.
我将其理解为:客户端只能根据服务器响应正文(超文本)提供的操作来请求状态更改。
在 HTML 世界中,这是完全有道理的。客户端应该只能根据通过超文本 (HTML) 提供的链接来请求状态更改(新操作/页面)。
当资源以其他方式表示时 - 例如 JSON、XML、YAML 等。这并不那么明显。
让我们举一个“REST”JSON API 示例:
我通过发送 POST 请求来创建新资源(例如新评论)
/comments.json? # 带参数...
服务器响应:
# Headers
HTTP/1.1 201 Created
Location: http://example.com/comments/3
Content-Type: application/json; charset=utf-8
... Etc.
# Body
{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}
我知道我现在可以通过 header 中返回的 URI 访问此评论:http://example.com/comments/3.json
当我访问http://example.com/comments/3.json时我明白了:
{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}
假设 API 文档告诉我,我可以通过向同一 URI 发送 DELETE 请求来删除此评论。这在“REST”API 中相当常见。
服务器在 GET http://example.com/comments/3.json
处的响应没有告诉我任何有关通过发送 DELETE 请求来删除评论的信息。它向我展示的只是资源。
我还可以删除具有相同 URL 的评论,这是客户端通过带外信息(文档)知道的事情,而不是由服务器的响应发现和驱动的。
此处,客户端假设 DELETE 操作(以及可能的其他操作)可用于此资源,并且之前尚未从服务器接收到此信息。
我是否误解了 HATEOAS,或者我的说法是否正确,从严格意义上来说,符合上述描述的 API 不会是 REST API?
我知道 100% 遵守 REST 并不总是可能的,也不是最务实的方法。我发布这个问题纯粹是为了满足我自己对 REST 背后理论的好奇心,而不是寻求有关现实世界最佳实践的建议。
最佳答案
乔恩·摩尔给出了an excellent talk 2010 年 11 月,关于编写真正的 RESTful(即 HATEOAS 支持)API 和客户端的具体细节。在第一部分中,他认为 JSON 不是适合 REST 的媒体类型,因为它缺乏一种普遍理解的表示链接和支持的 HTTP 方法的方式。他认为,好的 ol' XHTML 实际上是完美的,因为解析它的工具(即 XPath)很容易获得,它支持表单(想想 GET 链接模板和 PUT、POST 和 DELETE 方法),并且有一种易于理解的方式识别超链接,以及主要通过在任何标准 Web 浏览器中使用 API 的能力实现的一些其他优势(减轻开发人员、QA 和支持人员的工作。)
在观看他的演讲之前,我一直提出的论点是,JSON 的带宽消耗比任何 *ML 语言(例如,Python)要低得多。 XML、HTML、XHTML。但是,通过尽可能使用简洁的 XHTML,例如相对链接而不是绝对链接(在他整个演讲中使用的示例中有所暗示,但并不那么明显),并使用 gzip 压缩,这个论点就失去了很多分量。
我意识到诸如JSON-Schema之类的努力和 other RFC 正在尝试标准化 JSON 中的内容,但与此同时,Moore 的演讲说服我尝试一下 XHTML。
关于rest - 使用 REST split 头发 : Does a standard JSON REST API violate HATEOAS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055197/
我正在为学校做作业。该代码应该从文件中读取并创建一个数组,然后对数组的值进行排序以输出某些信息。只要我在文件中有 3 行以上的信息,它就可以正常工作。如果没有,我会收到以下错误: First-chan
在我的表中,我有一个唯一的约束。在 hibernate 中,当我添加一个违反该约束的项目时,我想捕获它,因此它将更新而不是创建一个项目。 当我没有设置 try-catch block 时 up
我正在尝试将 Excel 文件中的一些数据插入到表中。我有两个excel文件如下: Test2: 5/12/2012 5/18/2012 ABQ ANC 1 52 5/12/2012
我有自定义约束: @Target({FIELD, METHOD}) @Retention(RetentionPolicy.RUNTIME) @ConstraintComposition(Composi
“违反任何时间序列”和“违反所有时间序列”这两个选项有什么区别?我可以想象前者会轻松做什么,但我不知道后者会做什么。 所有时间序列?它的射程有多长?为什么它有一个 for 选项? 最佳答案 What'
我正在尝试初始化 DataEditor 的对象,我的DataEditor类(class)工具interface IDataEditor where T : IEditableObject . Data
我正在使用带有 java 插件 4.0 和 findbugs 插件 3.4.3 的 SonarQube 5.6。使用此配置,findbugs 报告的外部类违规不会被报告为 Sonar 违规。以下是代码
我正在使用 DbUnit 框架对我的 JPA 实体 bean 进行单元测试。我已经从数据库表生成了实体。还将 DB 数据导出到 xml 文件中,DbUnit 在执行测试时可以使用这些文件。 但是对于每
我写了这段简单的代码来动态分配一个 4 维数组: #include #include int**** alloc() { int i,j,k; int ****matrix;
我的 Java 程序出现问题。我使用 MS Access 作为数据库,并使用 UCanAccess 连接到数据库。 当我尝试将文本插入数据库时,出现异常: net.ucanaccess.jdbc.
我正在尝试使用埃拉托斯特尼筛法解决 SPOJ 的 PRIME1 问题。该代码对于较小的整数工作正常,但对于长整数显示以下错误 - "Unhandled exception at 0x770d15ee
我不明白这个案例,但这对我来说真的很重要,请帮助我... void __fastcall TForm1::Button4Click(TObject *Sender) { String masu
请看我的代码: adj = (int *)calloc(n * n, sizeof(int)); scanf("%d", &m); for (i = 0; i < m; i++) { scan
下面这段代码有什么问题以及如何修复它。 #include using namespace std; template class guard{ public: guard(Func1 firs
我有一个多线程 C# 应用程序,它创建文件,打开它们进行处理,然后在完成后删除它们。此应用程序可以预期处理 1 - 100 个文件。有点随机(很可能归因于应用程序的多线程性质)当我尝试在处理后删除文件
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
是否有可能在出现段错误后恢复 C 程序的正常执行流程? struct A { int x; }; A* a = 0; a->x = 123; // this is where segmenta
在 Magento 中使用信用卡/借记卡下订单时出现以下错误: Order saving error: SQLSTATE[23000]: Integrity constraint violation:
我正在处理属于 SDK 一部分的文件。当我在 phpstorm 中将文件提交到 svn 时,我收到关于 Unused definition SomeFunction 的警告,其中 SomeFuncti
简而言之,我有一个 C# 应用程序执行大量 mciSendString 调用(通过 dllimport)来控制 wav 文件播放(本质上是打开、播放、暂停、停止、状态、关闭)。运行一段时间后,应用程序
我是一名优秀的程序员,十分优秀!