如何以REST(ful)方式将一个请求中的多个项目发布到API?

时间:2015-07-01 08:41:15

标签: angularjs node.js rest post

这是一个更具概念性的问题,所以我认为使用的框架并不重要。我仍在构建一个带有Node& amp;的API。表达和Angular的前端。

情景

用户将有关图书的信息输入到单个表单中。然后将其提交给应该进行验证的API(除了前端验证)并保存到数据库中。

表单包含数据库中几个模型的信息:

  • 书籍:标题,描述等
  • 作者:许多作者都有很多书
  • 发布商:一个发布商有很多书

如果数据库中已存在作者或发布者,则将链接而不是创建。

问题:

我想在一个单一的请求中实现这一点。

  • 这样做的正确方法是什么?
  • 我应该将formdata发布到/api/books并使用我的ORM解决后端方面的复杂性以及创建/链接作者和发布者的书模型上的某种生命周期回调吗?
  • 我的API路线应该以任何方式反映出来吗?
  • 我应该创建某种反映图书,作者和出版商组合的虚拟模型(例如BookCollection)吗?
  • 调用GET /api/books/:id时可以检索所有三个吗?
  • 是否有经过验证的方法来处理多个对象的验证?

感谢您的投入!一切都有帮助!

2 个答案:

答案 0 :(得分:3)

以下是我对此的看法:

  1. 尽可能保持您的API清洁。在不久的将来,与API混淆是需要麻烦的。因此,我建议将api作为/ api / books。
  2. 您的图书报名表中是否有作者和出版商的字段?我想您希望与现有作者和发布者一起下拉/预先输入,输入图书详细信息的用户将选择1(或更多),对吧?在这种情况下,您的图书模型应该包含作者和出版商的ID。这可以。本书的定义要求您具有这些跨职能领域(但仅限于Ids)。所以你应该有3个端点:/ api / books,/ api / authors和/ api / publishers。
  3. 当您在页面上显示图书详细信息时(或许显示图书),您必须决定是否要通过复杂的API在一次通话中获取作者和发布者详细信息,或者进行三次调用获取相关数据。后一种选择更清洁,更具可扩展性,我会选择它。您可以在服务器端汇总所有这些数据,它会更快,但您可以构建庞大的不可重复使用的API,它只能满足您的特定目的(可能会在以后更改)。因此,总结一下,在显示书籍时,需要3个API调用来获取书籍详细信息,然后再根据书籍api收到的ID获取两个以获取作者和发布者详细信息。
  4. 让我们采取两种方案:第一本书中包含数据库中的作者/出版商。在这种情况下,用户可以从预先输入中选择它们并保存ID。当用户没有从预先输入中选择任何作者/出版商时,则为第2。在这种情况下,您的模型将publisherId和authorId设为null。当您在/ api / books上收到此请求时,您可以创建作者和发布者,并使用他们的ID更新数据库中的书籍对象。
  5. 请注意,这样做不会阻止您在服务器上实施验证。您仍然可以在服务器端验证,但它使您的客户端架构更清洁。此外,您的API模块化程度足以供多个消费者使用。

答案 1 :(得分:1)

创建新模型BookCollection是一个很好的解决方案(对我来说)。您必须在服务器端生成新路由:/api/bookcollection

但是,您应该避免在服务器上复制所有数据操作。您应该重复使用/api/book中的代码来存储书籍,使用/api/authors中的代码来存储作者等。或者您很快就会遇到重大问题以维护重复的代码。

/api/bookcollection应该在添加每个数据之前检查所有数据是否正确。