web-dev-qa-db-ja.com

同じWeb APIコントローラー内でパラメータータイプが異なる2つのGETメソッドを使用できますか?

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つのメソッドについて質問するため、提案された重複する質問は異なります。異なるパラメータータイプについて質問しています。

15
Aaron

はい、可能です。デフォルトの構成をそのまま使用する場合、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から継承した規則によるルーティングよりも複雑なルートを作成できます。

18
Bradford Dillon