2012-10-03 120 views
2

這三條路線是一樣的嗎?通常首選哪一個?ServiceStack路線設計

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

非常感謝您......

回答

5

的首選路線實際上是包括自在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; } 
} 

可以模擬通過在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中間件如代理等

3

如果你想遵循REST準則,你不應該使用GET或POST刪除資源。

GET謂詞用於讀取資源。一個重要的經驗規則 是一個GET操作是安全的。也就是說,它可以重複執行 而不會明顯改變資源的狀態。此屬性是 由於各種原因非常重要。首先,索引引擎使用GET 來索引資源的內容。所以如果索引 資源也會改變它,那將會很糟糕。其次,代理 等中介可緩存GET操作的結果,以加速對相同資源的後續訪問 。

PUT和DELETE動詞允許請求以原子方式更改 資源的狀態。

POST動詞可以帶有多種含義。這是瑞士軍隊的HTTP動詞刀。對於某些資源,它可能用於更改內部狀態。對於其他人,其行爲可能是過程調用的遠程操作。

查看完整說明,請看page

+0

謝謝,該頁面是一個非常好的指導方針:) – Tom