ServiceStack路由设计

这3条路线是否相同? 通常首选哪一个?

[Route("/todo/{id}", "DELETE")] [Route("/todo/delete","POST")] [Route("/todo/delete/{id}","GET")] public class DeleteTodo : IReturnVoid { public int Id { get; set; } } 

非常感谢你…

首选路由实际上是在pathinfo中包含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调用中添加X-Http-Method-Override HTTP Request标头或在FormData或QueryString中添加字段来模拟Ajax或jQuery中的DELETE请求,例如

 POST /todo/1 X-Http-Method-Override=DELETE 

或嵌入在HTML FormData中,如:

 

虽然重要的是不允许DELETE通过GET作为合同GET应该没有副作用,因此可以安全地被HTTP中间件(如代理等)缓存和重放。

如果要遵循REST准则,则不应使用GET或POST来删除资源。

GET动词用于读取资源。 一个重要的经验法则是GET操作是安全的。 也就是说,它可以重复完成而不会明显改变资源的状态。 出于各种原因,此属性非常重要。 首先,索引引擎使用GET来索引资源的内容。 因此,如果索引资源也会改变它会很糟糕。 其次,诸如代理之类的中介可以缓存GET操作的结果以加速对相同资源的后续访问。

PUT和DELETE谓词允许请求以primefaces方式更改资源的状态。

POST动词可以带有各种含义。 这是瑞士军刀的HTTP动词。 对于某些资源,它可能用于改变内部状态。 对于其他人,其行为可能是远程过程调用的行为。

请查看该页面以获取完整说明。