从另一个资源POST请求创建外键记录是否RESTful?

时间:2018-05-05 17:19:14

标签: rest api-design

所以我的API中有一些资源与外键关系,除非首先对该特定资源进行POST,否则无法创建这些fk记录(按设计)。

即使Country是外键,我也无法通过POST到Wine创建国家/地区。

POST将转至/ api / wine not / api / country

换句话说,如果我将此有效负载发送到Wine资源:

{
  id: 79,
  name: "Bordeaux",
  country: {
      id: 76,
      code: "FR",
      name: "France"
    },
  year: "2005"
}

除非该国家已存在,否则将失败。我们无法从此POST创建国家/地区,因为我们正在发布到Wine资源而不是国家。

这是设计原因,因为API中存在其他外键关系,消费者永远无法修改或创建。此外,让消费者从单个有效负载创建多个资源似乎会开启引入拼写错误,重复记录和弄脏数据的可能性,特别是当API扩展并且人们围绕它编写脚本并获得熟悉将数据推入其中。

如果我有一个反映外键关系链的GET端点

/api/planet/country/state/city/postal_code/

我发布了一个帖子:

/api/postal_code/

我不应该创建一个行星,国家,州或城市,我应该只能参考这些资源的现有记录(如果存在),然后最终创建一个新的邮政编码。

我的问题很简单,这是什么标准做法?哪种方法更常用。如果我打开我的API以支持从单个端点创建每个外键资源 - 似乎它将首先消除使用外键关系的一些好处。

2 个答案:

答案 0 :(得分:0)

你拥有它的方式是RESTful。要创建葡萄酒行,您需要知道该葡萄酒的所有相关细节。

当您有一个用例来查看所有葡萄酒时,嵌套路线是好的,而不是来自特定公司的葡萄酒。

即:

GET /api/wine/< - 将返回数据库中的所有葡萄酒 VS

GET /api/countries/76/wine< - 将为法国归还所有葡萄酒。

否则,两种方式都是RESTful,因为路由描述了资源,并且更新它的模式保持不变。

答案 1 :(得分:0)

在调用新的create-child-resource api时创建父资源不是RESTful。如果父资源必须存在才能创建子资源,最好的方法是遵循分层api结构,并在未找到引用的父资源时抛出异常。

Hierarchical API structure :
/api/countries/$country_id/wines - POST

如果您遵循此结构,api消费者将知道必须存在这些父资源才能使客户端apis正常工作。

另一方面,如果您认为api变得更长,那么当父资源(国家/地区)不存在时,您可以抛出异常。