MVC4 WebAPIプロジェクトでルーティングを構成しようとしています。
名前やタイプに基づいて製品を検索できるようにしたい:
/api/products?name=WidgetX
-WidgetXという名前のすべての製品を返します/api/products?type=gadget
-ガジェットタイプのすべての製品を返します
ルートは次のように構成されます。
config.Routes.MapHttpRoute(
name: "Get by name",
routeTemplate: "api/products/{name}",
defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty }
);
config.Routes.MapHttpRoute(
name: "Get by type",
routeTemplate: "api/products/{type}",
defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty }
);
問題は、クエリ文字列パラメータの名前が無視されるように見えるため、クエリ文字列パラメータの名前に関係なく、最初のルートが常に使用されることです。ルートを修正して正しく設定するにはどうすればよいですか?
必要なのは、クエリ文字列がルーティングパラメータとして使用されないため、以下の1つのルートのみです。
config.Routes.MapHttpRoute(
name: "Get Products",
routeTemplate: "api/products",
defaults: new { controller = "ProductSearchApi" }
);
そして、以下のような2つのメソッドを定義します。
GetProductsByName(string name)
{}
GetProductsByType(string type)
{}
ルーティングメカニズムはsmartであり、入力パラメーターと同じかどうかにかかわらず、クエリ文字列の名前に基づいてURLを正しいアクションにルーティングします。もちろん、接頭辞を持つすべてのメソッドはGet
です
これを読む必要があるかもしれません: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection
ルートにクエリパラメータを含める必要はありません。すべてのApiControllerでHttpメソッドをカバーするために、単純なルートマップが1つだけあるはずです。
_routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
_
ルートを調整する必要があるのは、実際には実行していないように見えるパラメータを実際のパスに移動する場合のみです。次に、2つのフィールドで検索するGET
httpメソッドは次のようになります。
_public IEnumerable<Product> Get(string name, string type){
//..your code will have to deal with nulls of each parameter
}
_
一度に1つのフィールドで明示的に検索する場合は、異なる目的で異なるコントローラーを使用することを検討する必要があります。つまり、単一のGet(string type)
メソッドを持つSearchProductByTypeController
です。ルートは/ api/SearchProductByTypeController?type = gadgetになります
コントローラーは大丈夫ですか?つまり、パラメータの名前。
public string GetProductsByName(string name)
{
return "Requested name: " + name;
}
public string GetProductsByType(string type)
{
return "Requested type: " + type;
}
string.Empty
のRouteParameter.Optional
を変更してみてください