2012-12-29 59 views
4

TL; DR總結:我可以爲HTTP GET配置MVC Web API路由嗎,PUT & DELETE?通過MVC的「真實」REST路由4 Web API

我一直在尋找用私有API替換我們的舊數據訪問層(基於數據集和TableAdapter的DLL),以創建一個公共API,如果它成功的話。我已經使用MVC 4做了一些工作來刷新我們的前端,並且喜歡使用它,所以在深入到基於WS或WCF的庫之前探索「Web API」項目類型似乎是明智的。

最初的演示,讓我很好地返回XML/JSON,例如:

//service.url/api/Users

...返回用戶的列表,而

//service.url/api/Users/99

:特定用戶的詳細信息,可通過以下方式訪問

到目前爲止,如此RESTful。但是,爲了真正將URI映射到資源,我想對上面列出的URI執行HTTP PUT(新用戶)或HTTP DELETE(刪除用戶)。在所有我見過的這些項目,在Visual Studio提供的支架沿例子,這個約定如下:

//service.url/api/Users/Create

// service.url/API /用戶/刪除/ 99

//service.url/api/Users/Update/99

...等等。這感覺就像將問題轉移到了我身邊,這是什麼東西放在一起非常好!

關於如何最好地解決這個問題的想法?

+0

您正在查找的實際上是Web API中的默認路由。你遇到什麼問題? –

回答

8

你想要的是MVC Web API中的默認值。我不確定你在看什麼,但這裏有一個很好的例子routing the Get/Post/Put/Delete to actions

例如,你可能想:

public class UsersController : ApiController 
{ 
    // GET http://service.url/api/Users/1 
    [HttpGet] 
    public User GetUser(int id); 

    // POST http://service.url/api/Users/?name=richard... 
    [HttpPost] 
    public User AddUser(User model);  

    // PUT http://service.url/api/Users/?id=1&name=Richard... 
    [HttpPut] 
    public User UpdateUser(User model); 

    // DELETE http://service.url/api/Users/1 
    [HttpDelete] 
    public User DeleteUser(int id); 
} 

我明確設置這些,但GetUserDeleteUser不需要前綴,因爲他們start with the matching HTTP method

+0

謝謝,那真是太棒了!我不知道命名約定是如此精細。 –

4

Erik提供的鏈接是一個好的開始,但是我看到在尋找一個使用HTTP動詞執行這些CRUD操作的簡單RESTful API時,它會如何混淆這種情況。如果你正在尋找使用GET,PUT,POST和DELETE(也可能是PATCH,但我沒有在這裏覆蓋)的HTTP動詞,並且使用約定可以,那麼以下內容將起作用:

public class UsersController : ApiController 
{ 
    // GET http://service.url/api/Users 
    public User GetAllUsers(){ ... } 

    // GET http://service.url/api/Users/1 
    public User GetUser(int id){ ... } 

    // POST http://service.url/api/Users/ 
    // User model is passed in body of HTTP Request 
    public User PostUser([FromBody]User model){ ... } 

    // PUT http://service.url/api/Users/1 
    // User model is passed in body of HTTP Request 
    public User PutUser(int id, [FromBody]User model){ ... } 

    // DELETE http://service.url/api/Users/1 
    public User DeleteUser(int id){ ... } 
} 

請注意,在Web API中使用HTTP動詞操作約定時,不需要該方法的屬性。此外,請注意,我在用戶參數中使用[FromBody]屬性來表示POST和PUT,表示主體包含我希望發送的數據。如果嘗試附加到資源,這對POST可能不是最方便的,而且我還沒有嘗試使用Web API通過查詢參數創建/修改數據。它確實使呼叫感覺非常乾淨,將您的數據放入正文中。 「POST /將此內容放入此資源的正文中。」

此外,我在規範中閱讀PUT的方式,我很可能是錯誤的,它是作爲替換。鑑於上面的最後一行,這也是有道理的。我在這個位置放置這個資源,替換已經存在的資源。規範(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)指出:「如果Request-URI引用一個已經存在的資源,封閉實體應該被認爲是駐留在原始服務器上的一個修改版本。」他們使用的術語是「修改」的,所以我想這給最終用戶留下了足夠的空間來解釋。這就是PATCH進來的地方(http://tools.ietf.org/html/rfc5789),但我目前還沒有足夠的信息來評論這一點。