Tom*_*Tom 2 .net c# servicestack
这3条路线是否相同?通常首选哪一个?
[Route("/todo/{id}", "DELETE")]
[Route("/todo/delete","POST")]
[Route("/todo/delete/{id}","GET")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你...
首选路由实际上包含Id在pathinfo中,因为DELETE请求没有HTTP请求主体,您可以提交此信息,例如:
[Route("/todo/{id}", "DELETE")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
出于实际原因,您可能希望允许POST执行DELETE,因为我的默认浏览器(以及某些代理)不允许发送DELETE请求.
[Route("/todo/{id}/delete", "POST")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以通过在Ajax调用中添加X-Http-Method-Override HTTP Request标头或在FormData或QueryString中添加字段来模拟Ajax或jQuery中的DELETE请求,例如
POST /todo/1
X-Http-Method-Override=DELETE
Run Code Online (Sandbox Code Playgroud)
或嵌入在HTML FormData中,如:
<form action="/todo/1" method="POST">
<input type="hidden" name="X-Http-Method-Override" value="DELETE"/>
</form>
Run Code Online (Sandbox Code Playgroud)
虽然重要的是不要通过GET允许DELETE通过GET,但GET应该没有副作用,因此可以安全地被HTTP中间件(如代理等)缓存和重放.