【发布时间】:2014-09-30 02:37:48
【问题描述】:
统一界面
统一接口约束是任何 REST 服务设计的基础。[14]统一的接口简化并解耦了架构,使每个部分都可以独立发展。该接口的四个指导原则是:
资源识别
在请求中标识单个资源,例如在基于 Web 的 REST 系统中使用 URI。资源本身在概念上与返回给客户端的表示是分开的。例如,服务器可以从其数据库中以 HTML、XML 或 JSON 的形式发送数据,这些都不是服务器的内部表示,无论如何都是同一个资源。
通过这些表示来操纵资源
当客户端持有资源的表示,包括任何附加的元数据,它有足够的信息来修改或删除资源。
自我描述信息
每条消息都包含足够的信息来描述如何处理该消息。例如,调用哪个解析器可以由 Internet 媒体类型(以前称为 MIME 类型)指定。响应还明确指出它们的可缓存性。
超媒体作为应用程序状态的引擎(A.K.A. HATEOAS)
客户端仅通过服务器在超媒体内动态识别的动作(例如,通过超文本中的超链接)进行状态转换。除了应用程序的简单固定入口点外,客户端不假定任何特定资源可用于任何特定资源,而不是先前从服务器接收到的表示中描述的资源。
我正在听一个关于这个主题的讲座,讲师说:
“当有人使用我们的 API 时,如果您能够获取客户对象并且您知道有订单对象,那么您应该能够以与获取客户对象相同的模式获取订单对象。这些 URI 看起来会很像。”
这让我觉得是错误的。 与其说是 URI 的外观或一致性,不如说是使用 URI 的方式(识别资源,通过以下方式操作资源)陈述、自我描述的消息和仇恨)。
我认为这根本不是统一接口的意思。究竟是什么意思?
【问题讨论】:
-
我相信他们的意思是,如果您可以通过路由为 /api/customer 的端点获取客户信息,那么您可以推断要获取订单信息,您可以向 /api/order 发出请求
-
@vesuvious 这正是我的意思。那是错误的。 REST API 是发现 API 而非推理 API。客户不应做出任何推论。如果是这样,则客户端和服务器耦合得太紧了。
-
@JohnSaunders 我不确定你的意思。 REST API 的定义是发现 API。
-
@jon 我不明白你的意思。你的cmets一直很神秘。我是不是傻了,这整件事完全错了?我真的很想理解这一点。如果你不知道那也没关系。
-
RESTful 架构的严格定义是它必须是可发现的……不幸的是,大多数 API 都声称是 RESTful 并且未能满足此约束。在现实世界中,许多不是严格 RESTful 的 API 都称为 REST,因为它们使用 HTTP 和 JSON 或 XML,有时在 URL 中有参数,有时使用 HTTP 动词/方法。有些人使用超媒体 API 作为一个术语来表示 API 是真正的 RESTful。对于@JohnSaunders,您应该查看 github 的 api 以查看可发现的 API
标签: rest definition uniform-interface