1

私は、次のようにクエリできるアイテムのリストを持っているRestfulサービスを作成しています:

 GET Api/Items

すべてのアイテムをリストします。もちろん、これらのアイテムを「最も人気のある」、「ユーザー x に属する」、または「カテゴリ Y に属する」としてリストする必要もあります。

stackoverflow 2.0 API をちらりと見て、これをどのように解決したかを確認すると、次のように URL に名前を付けました。

 GET Api/Items/MostPopular

そして、私が採用したいこの方法論は、理にかなっており、見栄えがするようです。

ただし、この URL 構文も許可するように Web-API を構成するにはどうすればよいですか? デフォルトのルートは次のとおりです。

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional }
);

したがって、その前に余分なルーティングを追加する必要があると思います。私はこのようにそれを行うことができます:(これが機能する場合)

config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/{controller}/MostPopular",
      defaults: new { id = RouteParameter.Optional }
);

しかし、それは私が好きではないすべてのコントローラーに MostPopular ビットを追加します。

このようなものは機能しますか?

 config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/Items/MostPopular",
      defaults: new { id = RouteParameter.Optional }
 );

ルーティング テーブルがすぐに非常に大きくなり、維持できなくなる可能性があるため、これが本当に正しい方法でしょうか?

4

2 に答える 2

3

最良の方法は、別の get アクションを追加して、ルートrouteではなくジェネリックを構成することです。specific

最初に最も人気のあるアクションを追加

// add action for Most Popular
[ActionName("MostPopular")]
public MyResult GetMostPopular()
{
     return null;
}

アクションを処理するルートを設定します。

// Controller with ID
// To handle routes like `/api/Items/1`
config.Routes.MapHttpRoute(
    name: "ControllerAndId",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Only integers 
);

// Controllers with Actions
// To handle routes like `/api/Items/MostPopular`
config.Routes.MapHttpRoute(
    name: "ControllerAndAction",
    routeTemplate: "api/{controller}/{action}"
);
于 2012-10-22T11:52:15.953 に答える
1

デフォルトから大きく逸脱しない場合は、おそらく最も保守しやすいものですが、次のようにルートでコントローラーとアクションを指定する必要があります。

config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/Items/MostPopular/{id}", 
    defaults: new { controller = "wheretogo",
                    action = "wichactiontotake",
                    id = RouteParameter.Optional 
                  } 
);

またはこれも機能します:

config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/test/{action}/{id}.html",
    defaults: new { controller = "test" } 
);

IISの構成に偽のファイルを使用する場合は、次のリンクを確認してください:http: //haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx

于 2012-10-22T11:52:37.203 に答える