2つのGETメソッドを含むasp.net web apiコントローラーがあります。 1つは文字列パラメータを受け入れ、もう1つはintパラメータを受け入れます。私は所定の場所にWeb APIが設定されたデフォルトルートのみを持っています。
public HttpResponseMessage GetSearchResults(string searchTerm)
{
HttpResponseMessage response;
//Do Work
return response;
}
public HttpResponseMessage Get(int id)
{
HttpResponseMessage response;
//Do Work
return response;
}
URLでint値を渡すたびに、文字列パラメーターを受け取るGETメソッドが呼び出されます。 intパラメータを取るGETメソッドが呼び出されることはありません。
同じコントローラー内でパラメータータイプが異なる2つのGETメソッドを持つことは可能ですか?
-編集-まったく同じパラメータータイプの2つのメソッドについて質問するため、提案された重複する質問は異なります。異なるパラメータータイプについて質問しています。
はい、可能です。デフォルトの構成をそのまま使用する場合、searchTerm
をクエリ文字列パラメーターとして渡すことを前提として作業する必要があります。ただし、たとえば/api/myurl/blah
のように、URLの一部として渡そうとすると、デフォルトの規則ルーティングは、それをint
バージョンのメソッドと一致させようとしてエラーを返します。デフォルトの設定を編集するか、 Attribute Routing を使用する必要があります。
一般的に、WebApiでは慣習ベースのMVCルーティングの有用性が低いため、通常は無効にして Attribute Routing を使用します。
属性ルーティングを有効にするには、
config.MapHttpAttributeRoutes();
あなたのWebApi設定に。
次に、メソッドをそのようにマークアップできます
[HttpGet]
[Route("api/myobject/")]
public HttpResponseMessage GetSearchResults(string searchTerm)
{
HttpResponseMessage response;
//Do Work
return response;
}
[HttpGet]
[Route("api/myobject/{id:int}")]
public HttpResponseMessage Get(int id)
{
HttpResponseMessage response;
//Do Work
return response;
}
これで、最初のメソッドを呼び出すことができます
/api/myobject?searchTerm=blah
そして2番目のビア
/api/myobject/1
そして、それらは衝突するべきではありません。
ただし、searchTerm
をクエリパラメータではなくURLに含める場合は、ルートを
[Route("api/myobject/{searchTerm}")]
api/myobject/{id:int}
ルートはすべてのIDをキャッチし、api/myobject/{searchTerm}
は他のほとんどすべてをキャッチします。ただし、URLがURLエンコードされていない場合、奇妙なことが発生する傾向があるため、これには注意してください。
探しているURLのフォーマットが正確にわからないので、提供したのは単なる例です。 link 私は以前に投稿して、属性ルーティングについてさらに深く掘り下げています。これにより、WebApiがMVCから継承した規則によるルーティングよりも複雑なルートを作成できます。