web-dev-qa-db-ja.com

RESTful Web API GETメソッドに複数の引数を渡す/受け取る方法は?

パラメーターを取る(データセットではなくスカラー値を返す)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、ルーティングメカニズムは、2つの引数が渡されるので、2つの引数を指定してGet()メソッドを呼び出す必要があることを理解しますか( "構成上の規約")、または適切にルーティングするために実行する必要があることは他にありますか?

9
B. Clay Shannon

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/42GetItemByNameAndIdにマップされ、http://192.112.183.42:80/api/platypusItems/42GetItemByIdにマップされます。

次のような構成で属性ルーティングを有効にする必要があることに注意してください。

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/42GetItemByIdにマップされますが、http://192.112.183.42:80/api/platypusItems/42?name=DuckbilledPlatypisAreGuysTooGetItemByNameAndIdにマップされます。これは、Web APIがGetItemById

詳細については、Mike Wassonの記事 Attribute RoutingRouting and Action Selection および Routing in Web API を参照してください。

17