如何将多个args传递/接收到RESTful Web API GET方法?

时间:2013-11-10 15:27:02

标签: c# rest asp.net-web-api asp.net-4.5 asp.net-web-api-routing

采用参数(返回标量值而不是数据集)的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()方法,或者是否需要执行更多操作来处理事物适当?

1 个答案:

答案 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 RoutingRouting and Action SelectionRouting in Web API的Mike Wasson文章。