ServiceStack路线设计(ServiceStack Route design)

2019-08-01 03:49发布

这些是3路一样吗? 哪一个通常是较佳的?

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

非常感谢你...

Answer 1:

优选的路线实际上是包括Id在PATHINFO因为DELETE请求没有HTTP请求正文可以提交此信息,例如:

[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; }
}

你可以在你的FORMDATA或查询字符串,如添加了X-HTTP-方法,覆盖 HTTP请求头在你的Ajax调用或作为现场模拟的Ajax或jQuery的一个DELETE请求

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 DELETE的自合同约定GET的应该没有副作用,因此是安全的缓存和代理一样,HTTP等中间件重播



Answer 2:

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

该GET动词用于读取资源。 拇指的一个重要规则是:GET操作是安全的。 也就是说,它可以反复不明显改变资源的状态来完成。 此属性是出于各种原因非常重要。 首先,索引引擎使用GET索引资源的内容。 因此,这将是坏,如果索引的资源也改变了它。 其次,中介机构,如代理服务器,可以缓存GET操作的结果后续访问加速到相同的资源。

该PUT和DELETE动词允许请求原子改变资源的状态。

POST谓词可以携带很多种意思的。 这是HTTP动词的瑞士军刀。 对于一些资源,可以用来改变内部状态。 对于其他人,其行为可能是一个远程过程调用的。

看看那个页面的完整描述。



文章来源: ServiceStack Route design