是否符合HATEOAS标准?获得具有不同结果的相同地址

时间:2014-12-02 12:23:15

标签: api-design hateoas

当此调用每次返回不同的资源时,是否符合HATEOAS以通过GET /resources公开资源?

例如,根据一些内部算法,在客户端之间分配资源,这意味着我不希望每个客户端始终接收相同的资源(假设我编写了“当天的短语”服务器并随机分发它们):

第一个电话:GET /资源

200 OK
{
  "_links" : { "self" : "/resources/1" },
  "data" : "foo"
}

第二个电话:GET /资源

200 OK
{
  "_links" : { "self" : "/resources/2" },
  "data" : "bar"
}

或者最好是提供一个GET /resources/chooser,将links对象返回到具体资源并再次拨打电话?

2 个答案:

答案 0 :(得分:1)

HATEOAS是关于以下链接。因此,除非将这些操作(除了获取API根目录)公开为具有元数据的链接(例如" self"在您的示例中),否则它将满足HATEOAS约束。关于URI结构没有标准,只是建议。例如,路由对命名资源的调用更容易。请注意,对于REST客户端,URI结构无关紧要,因为它会检查链接元数据以决定是否要跟踪链接。

在您当前的示例中,/resources应该具有自我描述性元数据,例如rel=chooser或类似的东西。所以客户会知道它是什么。我认为您的URI结构违反了URI标准,因为该路径描述了URI的层次结构部分,但在当前情况下,/resources/resources/1之间没有层次结构,/resources/2的URI。因此,如果您想要创建和别名,或者选择单词" chooser",最好使用/resources/chooser/resources?chooser=true

答案 1 :(得分:1)

要回答您的直接问题,假设/ resource是您的应用程序的入口点,或者您有一个链接到/ resource的根资源,它肯定符合HATEOAS约束。

质疑这是否是RESTful架构有点棘手。有一点是你必须绝对指出结果不可缓存。使用HTTP,这将使用HTTP标头。这假设每个对/ resource的请求都会得到一个新的资源......也许相同的用户获得相同的资源......你可以允许缓存。

我一直对GET的幂等性感到困惑。您可以使用GET进行良好搜索,如果他们更新某些内容,则相同的GET可能会更改结果。当然这是其他改变状态的东西...但我记得他们会根据结果的点击来改变排名......这也是一个GET ......所以??

如果它是我的API,并且将请求设置为POST只是一个大问题,我可能会使用POST获得406 a GET。如果我真的需要GET而不是我太担心它。