Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在RESTful API中发布集合来创建项_Api_Rest - Fatal编程技术网

通过在RESTful API中发布集合来创建项

通过在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

我试图通过设计一个API来学习REST原则,并尽我所能遵循REST原则。REST API中的一种非常常见的做法是通过如下所示的POST创建资源:

{
    "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设计原则的文章

感谢您务实而周到的回复-非常有帮助。你引用的博客文章也很有帮助。