複数のパラメーターをWebAPIコントローラーメソッドに渡す方法

ここでの以前の投稿では、WebAPIでのパラメーターバインディングについて説明しました。この投稿では、複数のパラメーターをWebAPIコントローラーメソッドに渡す方法を学習します。

Web APIは、HTTP GET、POST、PUT、およびDELETE操作に必要なアクションメソッドを提供します。通常、単一のオブジェクトをパラメーターとしてPUTおよびPOSTアクションメソッドに渡します。Web APIは、デフォルトで複数のPOSTパラメーターをWebAPIコントローラーメソッドに渡すことをサポートしていないことに注意してください。しかし、複数のオブジェクトをパラメーターとしてWeb APIコントローラーメソッドに渡してPOSTリクエストを行うとしたらどうでしょうか?

問題を理解する

Web APIでは、Web APIコントローラーメソッドのメソッドシグネチャで複数の複雑なオブジェクトを渡すことはできません。WebAPIアクションメソッドに送信できる値は1つだけです。この値は、複雑なオブジェクトになることもあります。1つのパラメーターを実際のコンテンツにマッピングし、残りのパラメーターをクエリ文字列を介してマッピングすることにより、POSTまたはPUT操作で複数の値を渡すことができます。

次のコントローラークラスには、複数のパラメーターを受け入れるSaveという名前のPOSTメソッドが含まれています。

パブリッククラスAuthorsController:ApiController

    {{

        [HttpPost]

        public HttpResponseMessage Save(int Id、string FirstName、string LastName、string Address)

        {{

            //通常のコード

            Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

        }

   }

次に、以下に示すように、JQueryからWebAPIコントローラーメソッドを呼び出そうとしたとします。

$ .ajax({

 url: 'api / authors'、

 タイプ: 'POST'、

 データ:{Id:1、FirstName: 'Joydip'、LastName: 'Kanjilal'、Address: 'Hyderabad'}、

 dataType: 'json'、

 成功:関数(データ){

alert(data);

}});

残念ながら、このリクエストはWeb APIで処理できないため、この呼び出しは失敗します。同様に、複数の複雑なオブジェクトを受け入れるWeb APIコントローラーメソッドがある場合、このメソッドをクライアントから直接呼び出すことはできません。

[HttpPost]

public HttpResponseMessage PostAuthor(作成者作成者、文字列authenticationToken)

{{

  //通常のコード

  Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

}

[FromBody]属性または[FromUri]属性のいずれかを使用して、WebAPIコントローラーメソッドにパラメーターを渡すことができます。[FromBody]属性は、メソッドのパラメーターリストで1回だけ使用できることに注意してください。繰り返しになりますが、[FromBody]属性を使用する場合、Web APIコントローラーメソッドにパラメーターとして渡すことができる値(単純型または複合型)は1つだけです。[FromUri]属性を使用して任意の数のパラメーターを渡すことができますが、これはこの場合の理想的なソリューションではありません。

そして今、解決策

パラメータをWebAPIコントローラメソッドに渡すときの問題が何であるかを理解したので、考えられる解決策を調べてみましょう。これを実現する1つの方法は、以下のコードスニペットに示すように、複合オブジェクトを[FromBody]属性として渡し、文字列パラメーターをURI経由で渡すことです。

$ .ajax({

 url: 'api / authors?authenticationToken = abcxyz'、

 タイプ: 'POST'、

  データ:JSON.stringify(作成者)、

 dataType: 'json'、

 成功:関数(データ){

   alert(data);

}});

以下に示すように、クエリ文字列を解析するには、それに応じてWebAPIコントローラーメソッドを変更する必要があります。

[HttpPost]

public HttpResponseMessage PostAuthor(作成者作成者)

{{

  var data = Request.RequestUri.ParseQueryString();

  文字列基準= queryItems ["authenticationToken"];

  //データベースにデータを保存するための通常のコード

  Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

}

しかし、WebAPIコントローラーメソッドにパラメーターとして渡される複数の複雑なオブジェクトがある場合はどうでしょうか。複数のパラメーターをラップする単一のオブジェクトを作成できます。以下のAuthorRequestクラスを参照してください。

パブリッククラスAuthorRequest

   {{

      public Author Author {get; セットする; }

      パブリック文字列トークン{取得; セットする; }

   }

基本的に、複数のパラメーターを1つのクラスにラップし、このクラスをWebAPIコントローラーメソッドのパラメーターとして使用できます。

更新されたWebAPIコントローラーメソッドは次のとおりです。

[HttpPost]

public HttpResponseMessage PostAuthor(AuthorRequest request)

  {{

       var author = request.Author;

       var token = request.Token;

       //データベースにデータを保存するための通常のコード

       Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

  }

JObjectを使用して、オブジェクトから複数のパラメーター値を解析することもできます。

[HttpPost]

public HttpResponseMessage PostAuthor(JObject jsonData)

{{

    動的json = jsonData;

    JObject jauthor = json.Author;

    文字列トークン= json.Token;

    var author = jauthor.ToObject();

    //データベースにデータを保存するための通常のコード

    Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

}

これを解決する別の方法は、FormDataCollectionを使用することです。ちなみに、FormDataCollectionは、MVCのFormCollectionによく似たキーと値のペアのコレクションです。

[HttpPost]

        public HttpResponseMessage PostAuthor(FormDataCollection form)

        {{

            var author = form.Get( "Author");

            var token = form.Get( "Token");

            //データベースにデータを保存するための通常のコード

            Request.CreateResponse(HttpStatusCode.OK、 "Success ...");を返します。

        }

Web APIフレームワークの拡張性のおかげで、HttpParameterBindingクラスを拡張して複数のパラメーターバインディングのサポートを提供することにより、独自のカスタムパラメーターバインダーを作成することもできます。

ASP.NETおよびASP.NETCoreでさらに多くのことを行う方法:

  • ASP.NETCoreでメモリ内キャッシュを使用する方法
  • ASP.NET WebAPIでエラーを処理する方法
  • 複数のパラメーターをWebAPIコントローラーメソッドに渡す方法
  • ASP.NET WebAPIで要求と応答のメタデータをログに記録する方法
  • ASP.NETでHttpModuleを操作する方法
  • ASP.NET Core WebAPIの高度なバージョン管理
  • ASP.NETCoreで依存性注入を使用する方法
  • ASP.NETでセッションを操作する方法
  • ASP.NETでHTTPHandlerを操作する方法
  • ASP.NETCoreでIHostedServiceを使用する方法
  • ASP.NETCoreでWCFSOAPサービスを利用する方法
  • ASP.NETCoreアプリケーションのパフォーマンスを向上させる方法
  • RestSharpを使用してASP.NETCore WebAPIを使用する方法
  • ASP.NETCoreでのログインの操作方法
  • ASP.NETCoreでMediatRを使用する方法
  • ASP.NETCoreでセッション状態を操作する方法
  • ASP.NETCoreでナンシーを使用する方法
  • ASP.NET WebAPIのパラメーターバインディングを理解する
  • ASP.NET CoreMVCでファイルをアップロードする方法
  • ASP.NET Core WebAPIでグローバル例外処理を実装する方法
  • ASP.NETCoreでヘルスチェックを実装する方法
  • ASP.NETでのキャッシュのベストプラクティス
  • .NETでApacheKafkaメッセージングを使用する方法
  • WebAPIでCORSを有効にする方法
  • WebClientとHttpClientとHttpWebRequestをいつ使用するか
  • .NETでRedisキャッシュを操作する方法
  • .NETでTask.WaitAllとTask.WhenAllを使用する場合