处理多个参数无需特殊路由记录。您创建的路由记录将寻找以下路由:
/api/controller/Dan@dan.com/Dan/FunnyLastName/TheCoffeeShop
但您正在尝试传递参数,而不是指定路由。
使用这个路由记录:
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "DefaultAction" });
以下是GET端点:
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
{
}
可能会受到以下打击:
/api/controllername/?requestId=15&username=Dan
或者
/api/controllername/?departmentName=SoftwareEngineering
或任何其他参数组合(或没有参数,因为它们具有默认值)
由于您有一个“命名”操作(GetId)而不是默认操作(GET、POST、PUT等),这使事情有点复杂,并且您需要制定一个自定义路由来处理操作名称。以下是我用于自定义操作名称的示例(在此示例中需要 id)。
config.Routes.MapHttpRoute("ActionRoute", "api/{controller}/{action}/{id}")
您的端点需要明确接受一个名为'id'的参数。
public HttpResponseMessage LockRequest(int id, bool markCompleted)
{
}
此端点将在以下路由处调用:
/api/controllerName/LockRequest/id?markCompleted=true
遵循RESTful规范,尽可能避免使用自定义操作名称更好。大多数情况下,您可以使用普通的HTTP动词,并仅使用命名操作来操作现有项(这就是为什么我的示例中需要ID的原因)。对于您的代码,您只需要两个GET端点,一个接受特定ID以获取该项,另一个根据“搜索参数”返回所有项(包括ID)。
public HttpResponseMessage Get(int id)
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
这两个都将由默认路由记录处理。