通过在RESTful API中发布集合来创建项
我试图通过设计一个API来学习REST原则,并尽我所能遵循REST原则。REST API中的一种非常常见的做法是通过如下所示的POST创建资源:通过在RESTful API中发布集合来创建项,api,rest,Api,Rest,我试图通过设计一个API来学习REST原则,并尽我所能遵循REST原则。REST API中的一种非常常见的做法是通过如下所示的POST创建资源: { "address_1": "123 Main St.", "city": "Anywhere", "some": "more stuff" } 要创建地址,您只需将它发布到:/api/customers/ABC123/addresses …然后回来,比如: 201已创建 位置:/api/customers/ABC123/a
{
"address_1": "123 Main St.",
"city": "Anywhere",
"some": "more stuff"
}
要创建地址,您只需将它发布到:/api/customers/ABC123/addresses
…然后回来,比如:
201已创建
位置:/api/customers/ABC123/addresses/XYZ789
我想这很清楚。但是,如果要同时创建多个地址,例如:
[
{
"address_1":"123 Main St.",
"city":"Anywhere",
"some":"more stuff"
},
{
"address_1":"456 State St.",
"city":"Somewhere",
"some":"more stuff"
}
]
在这种情况下,我仍然会发布到/api/customers/ABC123/addresses
,但是,我无法将位置返回到资源,因为创建了多个位置。但是,我认为可以返回集合的位置,例如:
[
{
"address_1":"123 Main St.",
"city":"Anywhere",
"some":"more stuff"
},
{
"address_1":"456 State St.",
"city":"Somewhere",
"some":"more stuff"
}
]
201已创建
位置:/api/客户/ABC123/地址
然而,在我自己使用API的经验中,我似乎只遇到了创建单个项目(如第一个示例中所示),而没有在一篇文章中创建多个项目(如第二个示例中所示)。所以,我的问题是:
第二个例子是不好的做法吗?若然,原因为何?似乎允许在一篇文章中创建多个项目会很方便,并减少聊天
如果第二个示例是而不是一种不好的做法,那么返回第二个示例中显示的位置是否合适
谢谢你的建议。回复是你想要提供的 您的响应可能是一个数组或位置集合,或者是一个简单的“成功”或“失败”字符串,甚至是一个html表,您希望通过一些javascript将其放入div中。您正在构建API,以便决定响应应该是什么样子
<> P>有很多工具可以自动将函数转换为REST端点,因此您可以考虑使用其中的一个。一个好处是,您可以返回一些东西,可能是一个字符串数组,它将自动将其转换为xml、json或yaml或任何请求的类型。在您上面描述的情况下,您实质上是通过添加其他地址来修改客户资源。您还添加了一个约束,希望能够一次添加多个地址 让我们接受这个要求 那你是做什么的?与大多数软件问题一样。不一定有一个最好的解决方案。这里有一些选择 您可以更新整个客户,例如
PUT
/api/customers/ABC123
。也许,客户端首先获取客户,然后添加新的addAddresses to addresses属性,最后将其放回服务器。操作返回200
(无需返回带有位置的201
,因为您刚刚调用了要返回的位置)。另外,请记住,对于REST,PUT
必须是幂等的,因此反复调用它应该总是产生相同的结果
类似地,(当然也有点奇怪)如果客户资源出于某种原因非常庞大,那么您可以在/api/customers/ABC123/addresses
处对整个新列表执行PUT
操作,然后再次返回200
(同样,不需要在刚刚调用它时返回位置)
现在,假设事情变得非常棘手,一个get
on customer加上一个PUT就不能工作(无论出于什么疯狂的原因)。您被要求只提供新地址,以提供某种方式修改地址列表。这里,PUT
不适合,因为它不是幂等的POST
但是没有幂等性的要求,因此POST是有意义的。但是在位置标题中返回什么位置?随机挑选一些物品是没有意义的。返回所有客户地址的位置也没有意义。幸运的是,POST
可以提供一个out。在这种情况下,只需返回状态200
。尽管如此,这“气味”。感觉不舒服。这时你必须退一步,意识到,嘿,休息太好了!但是,这不是一颗银弹。有时候事情并不完美。在这样的情况下,你尽了最大的努力去寻找一种平静的方式,但有时候,它就是不存在。在这种情况下,您可能需要为该功能提供一个web服务风格的端点
- 请参阅这篇关于RESTful设计原则的文章
感谢您务实而周到的回复-非常有帮助。你引用的博客文章也很有帮助。