这3条路线是一样的吗?通常情况下,哪个是首选的?
[Route("/todo/{id}", "DELETE")]
[Route("/todo/delete","POST")]
[Route("/todo/delete/{id}","GET")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
非常感谢..。
发布于 2012-10-03 17:15:59
由于DELETE请求没有可以提交此信息的Id
请求主体,因此首选的路径实际上是将HTTP包含在pathinfo中,例如:
[Route("/todo/{id}", "DELETE")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
出于实用的原因,您可能希望允许POST执行删除操作,因为我的默认浏览器(以及一些代理)不允许发送DELETE请求。
[Route("/todo/{id}/delete", "POST")]
public class DeleteTodo : IReturnVoid
{
public int Id { get; set; }
}
通过在Ajax调用中添加X-Http-Method-Override 请求头,或者将其作为FormData或QueryString中的字段,可以在Ajax或jQuery中模拟DELETE请求。
POST /todo/1
X-Http-Method-Override=DELETE
或者像这样嵌入到超文本标记语言FormData中:
<form action="/todo/1" method="POST">
<input type="hidden" name="X-Http-Method-Override" value="DELETE"/>
</form>
虽然重要的是不允许DELETE通过GET,因为按照约定,GET应该没有副作用,所以可以安全地被HTTP中间件缓存和重放,如代理等。
发布于 2012-10-03 16:24:08
如果您希望遵循REST准则,则不应使用GET或POST来删除资源。
GET动词用于读取资源。一条重要的经验法则是GET操作是安全的。也就是说,它可以重复进行,而不会明显地更改资源的状态。由于各种原因,此属性非常重要。首先,索引引擎使用GET来索引资源的内容。因此,如果索引资源也改变了它,那就不好了。其次,中介(例如代理)可以缓存GET操作的结果,以加速对同一资源的后续访问。
PUT和DELETE动词允许请求以原子方式改变资源的状态。
后置动词可以有多种含义。这是HTTP动词的瑞士军刀。对于某些资源,它可以用来改变内部状态。对于其他人,它的行为可能是远程过程调用的行为。
请查看该page以获取完整的描述。
https://stackoverflow.com/questions/12711522
复制