Как передать / получить несколько args в метод RESTful Web API GET?

обычные примеры методов GET RESTful, которые принимают параметр (возвращая скалярное значение, а не набор данных), показаны следующим образом:

public string Get(int id)
{
    //get and return the value
}

...где val передается, обычно является ID, поэтому вы можете использовать его для получения скалярного значения на основе этого уникального значения.

что, правда, если вы хотите передать несколько значений, таких как String и 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 передаются, он должен вызвать метод Get() с двумя args ("соглашение по конфигурации"), или есть больше, что нужно сделать, чтобы маршрутизировать вещи соответствующим образом?

1 ответов


если вы используете 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.

более подробную информацию можно найти в статьях Майк Уоссон о Маршрут, Маршрутизация и выбор действий и маршрутизация в Web API.