【发布时间】:2021-04-13 12:35:15
【问题描述】:
我正在为应用程序创建一个 Web API,并且我有一个针对资源的 DELETE 操作。资源为Names,都在一个SQLNames表中。每个名称都有一个Record 的外键(都在一个Records 表中),每个Record 都有一个FileName 和IsValid 列。
这意味着我可以通过FileName、IsValid 或这些值的组合删除一堆Names。这正是使用 API 的应用程序所需要的。
但是,在我看到的所有 API DELETE 端点示例中,它们总是通过 id 删除一条记录,这让我怀疑我的方法是否被认为是最佳实践。
这也提出了一个问题,我什至要如何做我想做的事?目前,我的DELETE 端点Names 是api/Names/{fileName},我不确定如何将IsValid 也包含在其中。至少应该需要FileName 和IsValid 值之一或两者。我不希望用户能够调用api/Names 并删除数据库中的每个名称。
在 NamesController 中删除操作:
[HttpDelete("{fileName}")]
public void DeleteBySourceFileName(string fileName)
{
_repo.DeleteNamesByFileName(sourceFileName);
}
我曾考虑在操作中添加IsValid 作为查询参数,但这仍然需要fileName。
最好的方法是什么?这样的端点是否适合 RESTful API?
【问题讨论】:
-
我个人从不删除任何记录。您永远不知道将来是否需要它们。只需为“已删除”创建一个字段并将其设置为 0 或 1。(您可以使用布尔值,但我更喜欢 tinyints 而不是布尔值)所有其他逻辑都遵循是否设置了该值。除非您可以保证文件名是唯一的,否则您似乎也需要 UID。
-
如果您要删除服务器上的文件,不妨考虑将文件移动到“已删除”文件夹中。使用 UID 和表名作为文件名的一部分。
-
@pcalkins 是否删除是另一个问题,但这里的主要问题是如何按照 restful 样式正确构建 URL。如果我们认为端点只是一个普通的 Web API 操作,这很简单,接受 POST 请求并获取删除操作所需的所有数据(文件名,...)。
-
将您的操作标题更改为:[Route("~api/DeleteNames/{fileName})] [Route("~api/DeleteIsValid/{IsValid}")] [Route("~api /DeleteBoth/{fileName}/{IsValid}")] public void DeleteBySourceFileName(string fileName, bool?isValid) - 所有 3 条路由都应该在另一个下面
-
我认为删除操作应该只接受一个 ID 并且应该要求确认。像这样按参数过滤确实看起来相当危险:D 我们会过滤,但通常结果会首先显示在 UI 上,以便用户清楚地看到应该删除的内容。当我们全部删除时有一个例外。
标签: c# rest asp.net-core asp.net-web-api .net-core