首选路线实际上是在路径信息中包含 Id,因为 DELETE 请求没有您可以提交此信息的 HTTP 请求正文,例如:
[Route("/todo/{id}", "DELETE")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
出于务实的原因,您可能希望允许 POST 执行 DELETE,因为我的默认浏览器(和一些代理)不允许发送 DELETE 请求。
[Route("/todo/{id}/delete", "POST")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
您可以在 Ajax 或 jQuery 中模拟 DELETE 请求,方法是在 Ajax 调用中添加 X-Http-Method-Override HTTP 请求标头或作为FormData 或 QueryString,例如
POST /todo/1
X-Http-Method-Override=DELETE
或嵌入在 HTML FormData 中,如:
<form action="/todo/1" method="POST">
<input type="hidden" name="X-Http-Method-Override" value="DELETE"/>
</form>
虽然重要的是不允许通过 GET 删除,因为根据合同 GET 应该没有副作用,因此可以安全地被 HTTP 中间件(如代理等)缓存和重放。