我有一个名为
的控制器产品 我有三个动作
我正在尝试的是以下映射
产品 - > api / products / product / 1
类别 - > api /产品/类别/酱料
全部 - > api / product / all
因为动作的名称支持URL结构所以我正在尝试一般的路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
其他一切正常,但是当我使用此http://localhost:2271/api/products/category/2
网址
<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>
另一方面,此网址api/products/category/?cat=abc
&amp; api/products/category?cat=abc
正在工作...... [猫是我的接收参数名称]
帮助!!!
答案 0 :(得分:1)
另一方面,这个URL api / products / category /?cat = abc&amp; api /产品/类别?cat = 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
的实例,并且您可以轻松更改代码来执行此操作。