2013-04-09 57 views
0

我有一個名爲MVC4 Web的API - 路由映射幫助需要

產品 和我在這三個動作

  • 產品控制器:接受一個int返回一個模型(類)對象
  • 類別需要一個字符串返回模型(類)對象數組
  • 所有沒有參數返回模型(類)對象的陣列

我試圖是下面的映射

產品 - > API /產品/產品/ 1

類別 - > api/product/category/sauces

所有 - > API /產品/所有

爲行動的名稱支持URL結構,所以我正在努力工作是

config.Routes.MapHttpRoute(
name: "DefaultApi", 
routeTemplate: "api/{controller}/{action}/{id}", 
defaults: new { id = RouteParameter.Optional } 
); 

一切的一般途徑,但我得到當我使用下面的錯誤此http://localhost:2271/api/products/category/2 URL

<Error> 
<Message> 
No HTTP resource was found that matches the request URI 'http://localhost:2271/api/products/category/2'. 
</Message> 
<MessageDetail> 
No action was found on the controller 'Products' that matches the request. 
</MessageDetail> 
</Error> 

,另一方面這個URL api/products/category/?cat=abc & api/products/category?cat=abc正在工作...... [貓是我的接收參數名稱]

幫助!!!

回答

1
,另一方面

這個URL API /產品/分類/?貓= ABC & API /產品/類別?貓= ABC工作fiine

是的,這是正確的,它會和這是做這件事的RPC風格。如果你想保持做它的RESTful的方式,你可以有以下的路由配置:

config.Routes.MapHttpRoute(
    name: "ProductById", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    name: "ProductByCategory", 
    routeTemplate: "api/{controller}/category/{cat}" 
); 

config.Routes.MapHttpRoute(
    name: "DefaultByAction", 
    routeTemplate: "api/{controller}/{action}", 
    defaults: new { action = "Get" } 
); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

而且你的控制器會是這個樣子:

public class ProductsController : ApiController 
{ 
    // api/products/ 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" };    
    } 

    // api/products/5 
    [HttpGet] 
    public string Get(int id) 
    { 
     return "Product" + id; 
    } 

    // api/products/category/fruits 
    [HttpGet] 
    public string Category(string cat) 
    { 
     return "Product " + cat; 
    }  
} 

注:我返回的字符串爲簡單起見但我假設您將返回Product的實例,並且您可以輕鬆更改代碼來執行此操作。

+0

嘿感謝您的答案,請您具體說明它如何不保持REST風格,我是REST API的新手。 – Moon 2013-04-09 06:19:32

+0

很高興能夠提供幫助。我認爲[一篇寫得很好的文章的鏈接更好](http://en.wikipedia.org/wiki/Restful#RESTful_web_APIs)。這裏提到了RPC。還有其他文件可以更好地解釋它,但我必須Google它們:) – 2013-04-09 06:24:46