2013-04-09 40 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