gpt4 book ai didi

inheritance - 如何使用继承来建模 RESTful API?

转载 作者:行者123 更新时间:2023-12-03 05:14:44 24 4
gpt4 key购买 nike

我有一个需要通过 RESTful API 公开的对象层次结构,但我不确定我的 URL 应该如何构建以及它们应该返回什么。我找不到任何最佳实践。

假设我有继承自 Animals 的狗和猫。我需要对狗和猫进行CRUD操作;我还希望能够对一般动物进行手术。

我的第一个想法是做这样的事情:

GET /animals        # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123

问题是/animals 集合现在“不一致”,因为它可以返回并获取不具有完全相同结构的对象(狗和猫)。有一个集合返回具有不同属性的对象是否被认为是“RESTful”?

另一个解决方案是为每个具体类型创建一个 URL,如下所示:

GET /dogs       # get all dogs
POST /dogs # create a dog
GET /dogs/123 # get dog 123

GET /cats # get all cats
POST /cats # create a cat
GET /cats/123 # get cat 123

但是现在狗和猫之间的关系已经消失了。如果想要检索所有动物,则必须查询狗和猫资源。网址数量也会随着每种新动物亚型的增加而增加。

另一个建议是通过添加以下内容来增强第二个解决方案:

GET /animals    # get common attributes of all animals

在这种情况下,返回的动物将仅包含所有动物共有的属性,删除特定于狗和猫的属性。这允许检索所有动物,但细节较少。每个返回的对象都可以包含指向详细、具体版本的链接。

有什么意见或建议吗?

最佳答案

我建议:

  • 每个资源仅使用一个 URI
  • 仅在属性级别区分动物

为同一资源设置多个 URI 绝不是一个好主意,因为它可能会导致困惑和意外的副作用。鉴于此,您的单个 URI 应基于通用方案,如 /animals

在“基础”级别处理整个狗和猫集合的下一个挑战已经通过 /animals URI 方法得到解决。

使用媒体类型中的查询参数和标识属性的组合可以轻松解决处理狗和猫等特殊类型的最终挑战。例如:

GET/animals(接受:application/vnd.vet-services.animals+json)

{
"animals":[
{
"link":"/animals/3424",
"type":"dog",
"name":"Rex"
},
{
"link":"/animals/7829",
"type":"cat",
"name":"Mittens"
}
]
}
  • GET/animals - 获取所有狗和猫,将返回 Rex 和 Mittens
  • GET/animals?type=dog - 获取所有狗,仅返回 Rex
  • GET/animals?type=cat - 获取所有猫,仅手套

然后,在创建或修改动物时,调用者有责任指定所涉及的动物类型:

媒体类型:application/vnd.vet-services.animal+json

{
"type":"dog",
"name":"Fido"
}

上述有效负载可以通过 POSTPUT 请求发送。

上述方案通过 REST 为您提供了与 OO 继承基本相似的特征,并且能够添加进一步的特化(即更多动物类型),而无需进行大手术或对 URI 方案进行任何更改。

关于inheritance - 如何使用继承来建模 RESTful API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10880472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com