问题的核心在于文档,但可能是我没有正确理解一个或多个方面。 如果是这样,请告诉我 :-)
记录链接关系
假设我在我的API中有一个更加通用的链接关系(https://example.com/rels/accounts),用于链接相关帐户。 具体含义可以根据上下文而变化,对吗?
在我的宣传牌上(或索引)上,我可能会使用该关系的链接来浏览所有帐户。
例如,在另一个资源-帐户组上,它可能仅链接到属于该组的特定子集。
我应该如何记录该关系?仅说明这是一个帐户收藏的链接似乎不够。然而,这正是{{link1:RFC5988}}所做的,只是描述链接本身的含义。因此,这可能是可行的方法。
问题在实际状态转换中会变得更加严重。让我们以
https://example.com/rels/create-account
作为例子。如果文档只是说“这是您创建新帐户的位置”,它并没有说明我必须如何使用该链接来创建资源。是否有类似以下内容的文档:
关系本身似乎不是正确的位置。特别是当考虑到该URL的有效负载也可能根据上下文而改变时。在我们的示例中,将该关系放在帐户组上将使忽略accountGroup字段成为强制性,因为该值由上下文提供。您可以将multipart/form-data或application/json POST到此端点,其中至少包含以下字段[...]。
记录文件配置文件
据我所理解,我可以(并且可能应该)为API中的每个资源都拥有一个文件配置文件,记录资源本身。这将包括其属性和可能出现的链接。那么我是否可以指定链接的确切含义呢?坚持我之前的例子,如果我为个人资料
https://example.com/profiles/account-group
编写文档,说明带有关系https://example.com/rels/accounts
的链接指向属于该组的账户集合,这对我来说是有意义的。但是当我们进入实际的状态转换时,事情似乎变得混乱了。
状态转换
假设客户端从帐户组导航到帐户集合。该资源本身与包含所有全局帐户的资源并没有真正的区别。它将具有分页链接和帐户资源本身的链接。如果该帐户集合资源具有关系类型
https://example.com/rel/create-account
的链接,那么我会遇到麻烦,对吧?因为这是一个只包含某个组帐户的帐户集合的信息没有被编码在https://example.com/profiles/account-collection
中,因此不能包含客户端提交到该资源时必须省略accountGroup属性的信息。
具体问题
- 我是否正确,关系定义应该是弱的,并且不包含任何关于如何与其链接的资源进行交互的信息?
- 如果是这样,我可以期望客户端遵循链接,然后根据该资源的配置文件来发现它们可以做什么。这似乎是错误的,特别是对于状态转换。
- 如果配置文件应记录客户端可能使用链接资源做什么,则无法在API中跨多个“跳跃”传输上下文,正确吗?
- 我应该使用更多的配置文件和关系吗?
https://example.com/profiles/global-accounts
和https://example.com/profiles/account-group-accounts
是我想到的。
越想越觉得,我必须要么缺少关键部分,要么可以用多种方式解决。因此,我知道可能没有100%正确的答案。但也许有人能启迪我,让我可以做出自己的权衡? :)
application/hal+json; profile=https://example.com/profile/customer
表示文档符合 hal+json 媒体类型,同时还受到给定配置文件的限制。简而言之,您实际上并不是定义新的媒体类型,而是使用自己的规则增强它们。我认为这是一个相当不错的概念。更多信息请参见:https://tools.ietf.org/html/draft-kelly-json-hal-08#section-7.1 https://tools.ietf.org/html/rfc6906 - Malaxapplication/vnd.acme.customer
期望您将 X、Y 发布到https://example.com/rels/edit
链接,但不包括 Z? - Malaxdelete
。我为什么要通过GET跟随链接呢?或者删除当前资源的事实是否仅由对当前资源(或Allow
标头)的OPTIONS
请求处理?但是,我仍然对所需资源本身(而不是其表示)的文档有问题。我没有“关键词”,可以将该文档附加到其中。 - Malax