C# 通过核心Web API中的可选参数删除多个记录的最佳实践是什么?
我正在为一个应用程序创建一个web API,我有一个资源的C# 通过核心Web API中的可选参数删除多个记录的最佳实践是什么?,c#,rest,asp.net-core,asp.net-web-api,C#,Rest,Asp.net Core,Asp.net Web Api,我正在为一个应用程序创建一个web API,我有一个资源的DELETE操作。该资源是名称,所有这些名称都位于SQL名称表中。每个名称都有一个记录的外键(全部在记录表中),每个记录都有一个文件名,是有效的列 这意味着我可以通过FileName、IsValid或这些值的组合来删除一组名称。这正是将使用API的应用程序所需要的 然而,在我看到的所有API DELETE端点示例中,它们总是按id删除一条记录,这让我怀疑我的方法是否被认为是最佳实践 这也提出了一个问题,我该如何做我想做的事情?目前,我的D
DELETE
操作。该资源是名称
,所有这些名称都位于SQL名称
表中。每个名称都有一个记录
的外键(全部在记录
表中),每个记录
都有一个文件名
,是有效的
列
这意味着我可以通过FileName
、IsValid
或这些值的组合来删除一组名称。这正是将使用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?我在postman中测试了这段代码。所有3条线路都正常工作。感谢@PavelAnikhouski的isValid:bool创意
[Route("~/api/Delete/{fileName}")]
[Route("~/api/Delete/{isValid:bool}")]
[Route("~/api/Delete/{fileName}/{isValid}")]
public void Delete(string fileName, bool? isValid)
{
.....
}
如果愿意,您可以为每个路由使用不同的名称,例如“DeleteByFileName”或“DeleteIsValid”,而不是“Delete”。它仍然可以正常工作。如果您想使用RESTful方法,我认为您可以使用以下三种方法之一一次删除多个项目:
使用查询字符串删除
,如前所述:DELETE api/names?filenames={file name}&isvalid={true | false}
。
- 它很简单,但缺点是将过滤器声明为可选的,而您已经说过不是,因为您不允许删除所有名称。操作代码类似于:
POST
到deletions
资源,返回标识符,然后使用标识符DELETE
,如下工作流:POST api/names/deletions
{
'filenames': [],
'isValid': false
}
到编码如下的端点:
public class DeletionInput
{
public string[] FileNames { get; set; }
public bool? IsValid { get; set; }
}
[HttpPost("deletions")]
public Task<IActionResult> CreateDeletion([FromBody] DeletionInput input)
{
// Based on the inputs, gather a list of Names to be deleted
// and assign an ID to it. The ID is returned in the response
}
(有关此选项的详细信息)
删除带有正文的
。HTTP删除请求可能有正文()- 请求举例:
- 行动实例:
公共类删除输入
{
公共字符串[]文件名{get;set;}
公共bool?有效{get;set;}
}
[HttpDelete]
公共任务删除([FromBody]删除输入)
{
//要删除的代码,但使用空/空参数避免删除(避免全部删除)
}
- 这也是一个简单的选择。ASP.NET支持它,但可能有供应商不支持。但是,HTTP规范允许这样做
Names
,而不是Delete
,因为我们正在删除Names
资源,而Delete
的操作是在请求的某个地方指定的。
public class DeletionInput
{
public string[] FileNames { get; set; }
public bool? IsValid { get; set; }
}
[HttpPost("deletions")]
public Task<IActionResult> CreateDeletion([FromBody] DeletionInput input)
{
// Based on the inputs, gather a list of Names to be deleted
// and assign an ID to it. The ID is returned in the response
}
[HttpDelete("deletions/{id}")]
public Task<IActionResult> DeleteByDeletionId([FromRoute] string id)
{
// the Names in the deletion list are effectively deleted only now
}
DELETE api/names
{
'filenames': [],
'isValid': false
}
public class DeletionInput
{
public string[] FileNames { get; set; }
public bool? IsValid { get; set; }
}
[HttpDelete]
public Task<IActionResult> Delete([FromBody] DeletionInput input)
{
// code to delete, but avoid delete with null/empty parameters (avoid delete all)
}