首页 > 解决方案 > 通用 REST API:在一个请求中插入父项和子项

问题描述

我正在构建一个具有或多或少复杂资源的 REST API。

假设,我在幕后有以下数据库结构。

父基:id|name

ChildBase:id|name|parentId

因此,显然 childBase 的“parentId”列是 ParentBase 的 id 字段的外键。

是否允许在一个发布请求中与其父级创建一个子级并管理关系服务器端。我的有效载荷如下所示,网址为“/api/parents”:

{
  id: <set by server>,
  name: Homer,
  {
    id: <set by server>,
    name: Lisa,
    parentId: <set by server (Homer's id)>
  }
}

还是我必须先使用自己的发布请求创建父级,然后获取返回的 id,将其设置为孩子的 parentId 并与孩子进行第二次发布请求?所以发送到 url “/api/parents”:

{
  id: <set by server>,
  name: Homer
}

现在我得到了 Homer 的 id=35,我可以用有效载荷向“/api/children”发送第二个请求:

{
  id: <set by server>,
  name: Lisa,
  parentId: 35
}

那么什么是最佳实践呢?

(我正在使用带有 sqlachemy 和 marshmallow 的烧瓶。所以也许你也有提示如何使用这些框架解决这个任务)

标签: restflaskforeign-keysflask-marshmallowflask-restx

解决方案


是否允许在一个发布请求中与其父级创建一个子级并管理 realtionship 服务器端。

就 REST 和 HTTP 而言,当然可以。

  1. 幕后数据结构的细节是实现细节,我们特意隐藏在 HTTP 门面后面;没有规定说您的资源模型必须与您的数据模型1:1 。
  2. 允许创建多个资源以响应单个请求

201(已创建)状态代码表示请求已完成并导致创建了一个或多个新资源。-- RFC 7231


推荐阅读