【发布时间】:2018-07-03 22:40:48
【问题描述】:
在 REST API 的上下文中,我一直在使用 DBIx::Class 创建相关行,即
POST /artist
{ "name":"Bob Marley", "cds":[{"title":"Exodus"}] }
最终调用$artist->new($data)->insert() 创建艺术家并在 CD 表中创建相关行。然后它将生成的对象发送回用户(通过DBIC::ResultClass::HashRefInflator),包括创建的主键和默认值。当用户对这些对象进行更改并将它们再次发送回 API 时,就会出现问题:
POST /artist/7
{ "name":"Robert Nesta Marley", "artistid":"7",
"cds":[{"title":"Exodus", "cdid":"1", "artistid":"7", "year":"1977"}] }
现在呢?从测试中我可以看出,DBIC::Row::update 不处理相关行的更改,因此在这种情况下,名称更改会起作用,但 CD 年份的更新不会。 DBIC::ResultSet::update_or_create 只需调用 DBIC::Row::update。所以我去寻找一些替代品,它们似乎确实存在,即DBIC::ResultSet::RecursiveUpdate,但它在 4 年内没有更新,并且对它的引用似乎表明它应该/将被折叠到 DBIC 中。那发生了吗?
我错过了一些更简单的东西吗?
显然,我可以处理这种特殊情况,但我有许多 API 需要编写,而且对所有这些 API 进行通用处理会更容易。我当然很想使用 RecursiveUpdate,但由于它明显被放弃了,所以我很谨慎。
【问题讨论】:
-
当然你可以用你的 api 做各种各样的事情,它是你的。但请重新考虑您在第一行 REST-api 中所说的内容。是的,可以发布到 /artists,包括(整个)CD 列表。更常见的是,创建 CD,保存他们的 ID;创建艺术家并将 ID 从 CD 发布到 /artists/{artist_id}/cds。基本上:每件事都有自己的 URI,由单独的 POST 操作创建。编辑,对现有资源执行 PUT,而不是混合多个资源的 POST。我们尝试了“PATCH”,但那是另一回事。
标签: perl dbix-class