3

我在客户端使用self href来自我的 HAL 资源的 CRUD 操作找到正确的路径。在单(吨)资源中,这工作正常(请参阅下面的地址资源,_links包含self href在嵌入资源中)但是当涉及到集合时,情况就不同了。当_links集合位于 时,不会呈现集合的_embedded

早些时候,我通过阅读第一个孩子的 url 来解决这个问题。但这还不够。如果集合是空的,我只有一个空数组,不可能像这样提取 url。如果我想在集合中创建一个新项目,我希望我的客户POST通过读取self hreffrom知道在哪里发送数据_links_links像这样将其包含到我的收藏中是否是个好主意:

{
    "_links": {
        "self": {
            "href": "http://example.com/api/v1/users/1"
        }
    },
    "_embedded": {
        "contacts": {

现在我可以在这里访问 self href:

            "_links": {
                "self": {
                    "href": "http://example.com/api/v1/users/1/contacts"
                }
            },
            "_embedded": {
                "contacts": [
                    {
                        "_links": {
                            "self": {
                                "href": "http://example.com/api/v1/users/1/contacts/2"
                            }
                        },
                        "id": "2",
                        "name": "John Smith"
                    },
                    {
                        "_links": {
                            "self": {
                                "href": "http://example.org/api/v1/users/1/contacts/3"
                            }
                        },
                        "id": "3",
                        "name": "Jane Doe"
                    }
                ],
            }
        },
        "address": {
            "_links": {
                "self": {
                    "href": "http://example.com/api/v1/addresses/1"
                }
            },
            "street": "Bakerstreet 11",
            "postal code": "123456",
            "city": "Some city",
            "country": "Some country",
        }
    },
    "id": "1",
    "name": "John Doe"
}

编辑(一年后)

最后我通过总是将嵌入资源的链接添加到父资源来解决这个问题。所以在上面的例子中,我的响应对象看起来像这样:

{
    "_links": {
        "self": {
            "href": "http://example.com/api/v1/users/1"
        },
        "contacts": {
            "href": "http://example.com/api/v1/users/1/contacts"
        },
        "address": {
            "href": "http://example.com/api/v1/addresses/1"
        }
    },
    "_embedded": {
        "contacts": [
            {
                "_links": {
                    "self": {
                        "href": "http://example.com/api/v1/users/1/contacts/2"
                    }
                },
                "id": "2",
                "name": "John Smith"
            },
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/v1/users/1/contacts/3"
                    }
                },
                "id": "3",
                "name": "Jane Doe"
            },
        ],
        "address": {
            "_links": {
                "self": {
                    "href": "http://example.org/api/v1/addresses/1"
                }
            },
            "street": "Bakerstreet 11",
            "postal code": "123456",
            "city": "Some city",
            "country": "Some country",
        }
    },
    "id": "1",
    "name": "John Doe"
}

所以无论我是否嵌入了资源,我总是知道它们的位置。_links对于联系人集合,我将在数组中有指向我的集合端点的链接,并将联系人本身放在_embedded.

4

1 回答 1

5

是的。这样做不仅是一种好习惯;由 HAL 规范推荐:

每个资源对象应该包含一个与 IANA 注册的“self”关系(由 RFC5988 定义)相对应的“self”链接,其目标是资源的 URI。

资源集合本身就是资源,别忘了。

于 2013-10-16T21:49:02.463 回答