采用参数(返回标量值而不是数据集)的GET RESTful方法的常见示例如下所示:
public string Get(int id)
{
//get and return the value
}
...传递的val通常是一个ID,因此您可以使用它来获取基于该唯一值的标量值。
但是,如果要传递多个值,例如字符串和int,该怎么办?这只是定义一个像这样的方法的问题:
public string Get(string someString, int someInt)
{
//get and return the value
}
......并且这样称呼它:
//const string uri = "http://192.112.183.42:80/api/platypusItems/someString/someInt";, zB:
const string uri = "http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42";
var webRequest = (HttpWebRequest) WebRequest.Create(uri);
IOW,路由机制是否会发现,由于传递了两个args,它应该使用两个args(“约定优于配置”)来调用Get()方法,或者是否需要执行更多操作来处理事物适当?
答案 0 :(得分:17)
如果您使用Web API 2,则可以使用“属性路由”来路由http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42
public class ItemsController : ApiController
{
[Route("api/{controller}/{id}")]
public string GetItemById(int id)
{
// Find item here ...
return item.ToString();
}
[Route("api/{controller}/{name}/{id}")]
public string GetItemByNameAndId(string name, int id)
{
// Find item here ...
return item.ToString();
}
}
http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42
将映射到GetItemByNameAndId
,而http://192.112.183.42:80/api/platypusItems/42
将映射到GetItemById
。
请注意,您需要在配置中启用属性路由,如下所示:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
但通常你应该将参数作为附加参数传递。使用GET请求尤其容易。这适用于Web API 1& 2:
public class ItemsController : ApiController
{
public string GetItemById(int id)
{
// Find item here ...
return item.ToString();
}
public string GetItemByNameAndId(string name, int id)
{
// Find item here ...
return item.ToString();
}
}
假设您有默认映射配置,http://192.112.183.42:80/api/platypusItems/42
将映射到GetItemById
,而http://192.112.183.42:80/api/platypusItems/42?name=DuckbilledPlatypisAreGuysToo
将映射到GetItemByNameAndId
,因为Web API可以映射2个参数而不是1 GetItemById
。
有关更多信息,请参阅有关Attribute Routing,Routing and Action Selection和Routing in Web API的Mike Wasson文章。