如果您使用 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
whilehttp://192.112.183.42:80/api/platypusItems/42?name=DuckbilledPlatypisAreGuysToo
将被映射到,GetItemByNameAndId
因为 Web API 可以映射 2 个参数而不是 1 个参数GetItemById
。
更多信息可以在 Mike Wasson 关于属性路由、路由和动作选择以及Web API 中的路由的文章中找到。