如何为组和列表形成超媒体

How to form Hypermedia for Groups and Lists

我正在设计一个 REST API 并且在这个特定的用例中,试图找出最好的方法以及这个超媒体应该是什么样子。

场景是调用者调用 /persons?fields=lastName;filter=beginsWith=b 因为他想要返回姓氏以 "b" 开头的人的列表。

下面显示了 JSON 响应,我正在尝试弄清楚如何最好地 mold/represent 包括与之相关联的超媒体。

您可以看到人员列表,但只能看到姓名 属性,因为它是每个人的部分代表。

然后我尝试在此处添加 HATEAOS,但不确定添加什么最有用以及应该参考什么。

我想好吧,我可以为我 return 所在的组(列表)本身提供一个 href。如果是这样的话,在哪里?我认为像我这样将它放在根对象中是没有意义的。因为期望是 return 一个人的列表,而不是一些根元对象,所以我对下面的内容感觉不太好。

有没有人认为它在这个特定实例中没有用或没有真正接受 HATEOS,我应该在这里提供一些其他类型的 href 链接?

JSON - 人员对象列表(表示)returned

[
    "meta": {
        "rel": "self",
        "href": "http://ourdomain.api/persons?fields=lastName;filter=beginsWith=b"
    },
    {
        "name": {
            "last": "best"
        }
    },
    {
        "name": {
            "last": "bettler"
        }
    },
    {
        "name": {
            "last": "brown"
        }
    }
]

嗯,这真的是你的选择,但我认为如果你从导航中排除一个表示(即不提供指向它的链接)那么它就不再是 HATEOAS(这里只是我的意见)。 在我看来,你可以按照你在问题中提供的 json 做一些事情,只需清楚地分开调用的结果和元信息:

{
  "meta": {
    "rel": "self",
    "href": "http://ourdomain.api/persons?fields=lastName;filter=beginsWith=b"
  },
  "resource" : [
    {
      "name": {
        "last": "best"
      }
    },
    {
      "name": {
        "last": "bettler"
      }
    },
    {
      "name": {
        "last": "brown"
      }
    }
  ]
}

这并不少见。另一种方法是在您 return 的每个资源中提供指向列表的链接,其关系类似于 parentsource(也许 source 更有意义,因为它是经过过滤的查询),例如

{[
   { "name" : {
        "last" : "best"
        },
     "meta": {
        "rel": "source",
        "href": "http://ourdomain.api/persons?fields=lastName;filter=beginsWith=b"
       }
   },
   { ..and so on.. }
]}

毕竟,列表只是结果的容器,所以如果不包含任何超媒体,'clean'(至少对我而言)感觉会更好。