首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向RESTful Web API GET方法传递/接收多个参数?

如何向RESTful Web API GET方法传递/接收多个参数?
EN

Stack Overflow用户
提问于 2013-11-10 23:27:02
回答 1查看 44K关注 0票数 10

带有参数(返回标量值而不是数据集)的GET RESTful方法的常见示例如下所示:

代码语言:javascript
复制
public string Get(int id)
{
    //get and return the value
}

...where传递的val通常是一个ID,因此您可以使用它来获取基于该唯一值的标量值。

但是,如果想要传递多个值,比如一个字符串和一个int,该怎么办呢?这仅仅是定义一个方法的问题,像这样:

代码语言:javascript
复制
public string Get(string someString, int someInt)
{
    //get and return the value
}

...and这样称呼它:

代码语言:javascript
复制
//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);

那么,路由机制是否会认为,由于传递了两个arg,它应该使用两个arg调用Get()方法(“约定优于配置”),或者还需要做更多的工作才能正确地路由事物?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-10 23:53:10

如果您使用WebAPI2,那么您可以使用属性路由来路由请求,比如http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42

代码语言:javascript
复制
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

请注意,您需要在如下配置中启用属性路由:

代码语言:javascript
复制
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中工作:

代码语言:javascript
复制
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

更多信息可以在Mike Wasson关于Attribute RoutingRouting and Action SelectionRouting in Web API的文章中找到。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19891494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档