关于 REST的Fielding 论文告诉您资源接口,您必须将 IRI 绑定到资源,这些资源是实体集。(这与 SOAP 不同,因为在那里您通常将 IRI 绑定到操作。)
根据Darrel Miller的说法,路径用于描述分层数据,查询字符串用于描述 IRI 中的非分层数据,但我们将路径和查询一起用于识别 API 内的资源。
因此,基于这些,您有两种方法:
- 您可以说,具有较少属性的同一实体可以映射到具有自己的 IRI 的新资源。在这种情况下 the
/movies/1?view=thin
或 the/movies/1/view:thin
是可以的。
优点:
- 根据
RDF,属性具有或两者
rdf:type
之一,而 REST 具有与语义网络和链接数据的连接。rdf:Property
rdfs:Resource
- 例如,为单个属性创建 IRI 是一种常见的做法
/movies/1/title
,因此,如果我们可以通过单个属性执行此操作,那么我们也可以通过属性集合来执行此操作。
- 它类似于我们已经用于实体集合的map reduce
/movies/recent
:等等......唯一的区别是,我们通过实体集合来减少列表或有序集,而通过属性集合我们可以减少地图。将两者结合使用会更有趣,例如:/movies/recent/title
,它可以返回最近电影的标题。
缺点:
通过 RDF,一切都有一个rdf:type
,rdfs:Resource
也许 REST 不遵循 Web 文档的相同原则。
我还没有发现任何关于单个属性或属性集合可以或不能被视为论文中的资源的信息,但是我可能不小心跳过了文本的那一部分(相当枯燥的东西)......
您可以说具有较少属性的同一实体只是同一资源的不同表示,因此它不应该具有不同的 IRI。在这种情况下,您必须将有关首选视图的数据放入请求中的其他位置。由于 GET 请求没有正文,而且 HTTP 方法不用于存储此类内容,因此您可以放置的唯一位置是 HTTP 标头。通过长期的用户特定设置,您可以将其存储在服务器上,或者存储在客户端维护的 cookie 中。通过短期设置,您可以在许多标题中发送它。通过content-type
标题,您可以定义自己的 MIME 类型,不推荐这样做,因为我们不喜欢可能仅由单个应用程序使用的数百个自定义 MIME 类型。通过content-type
标题,您可以添加配置文件按照Doug Moscrop 的建议添加到您的 MIME 类型。通过prefer
标题,您可以使用Darrel Miller建议的return-minimal
设置。理论上你可以通过标题做同样的事情,但我只通过分页遇到了范围标题。
优点:range
这当然是一种 RESTful 方法。
缺点:
- 现有的 HTTP 框架并不总是支持提取此类标头参数,因此您必须编写自己的短代码来执行此操作。
- 我找不到有关这些标头如何影响客户端和服务器端缓存机制的任何信息,因此某些浏览器可能不支持其中一些,并且服务器必须编写自己的缓存实现,或者找到支持标头的框架你想用。
注意:我个人更喜欢使用第一种方法,但这只是一种意见。
根据Darrel Miller的说法,IRI 的命名并不能真正计入 REST。
您只需确保单个 IRI 始终指向相同的资源,仅此而已。IRI 的结构不计入客户端,因为如果您不希望它因 IRI 命名的任何更改而中断,您的客户端必须满足 HATEOAS 约束。这意味着,服务器始终构建 IRI,客户端遵循这些 IRI,它在超媒体响应中获得。这就像使用网络浏览器来跟踪链接,然后浏览网络......通过 REST,您可以向您的超媒体添加一些语义,向您的客户解释它刚刚获得的内容。这可以是一些 RDF 词汇,例如 schema.org、微数据、iana 链接关系等等(甚至是您自己的应用程序特定词汇)......
所以使用漂亮的 IRI 不是 REST 关心的问题,只有在服务器端配置路由才是一个问题。您必须通过 REST IRI 确保您拥有资源 - IRI 映射而不是操作 - IRI 映射,并且您不使用 IRI 来维护客户端状态,例如存储用户 ID、凭据等...