【问题标题】:ServiceStack Route designServiceStack 路由设计
【发布时间】:2012-10-03 15:15:14
【问题描述】:

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

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

非常感谢...

【问题讨论】:

    标签: c# .net servicestack


    【解决方案1】:

    首选路线实际上是在路径信息中包含 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 中间件(如代理等)缓存和重放。

    【讨论】:

      【解决方案2】:

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

      GET 动词用于读取资源。一个重要的经验法则 是 GET 操作是安全的。也就是可以反复做 不会明显改变资源的状态。该物业是 由于各种原因非常重要。一、索引​​引擎使用GET 索引资源的内容。所以如果索引一个会很糟糕 资源也改变了它。第二,中介,如代理, 可以缓存 GET 操作的结果以加速后续访问 到同一个资源。

      PUT 和 DELETE 动词允许请求更改状态 以原子方式获取资源。

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

      查看page 以获得完整说明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多