C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# ASP.NET Web APIにおけるFromBody属性とFromUri属性の違いとは?

ASP.NET Web APIがコントローラーのメソッドを呼び出す際には、パラメータに値を設定する必要があります。この一連の処理は「パラメータバインディング」と呼ばれます。

通常、モデル(アクションパラメータ)はフォーマッターによってバインドされるのがデフォルトの動作ですが、URIから値を取得してバインドしたい場合は[FromUri]属性を付与します。FromUriAttributeはModelBinderAttributeを継承したクラスであり、Web APIに対して「IUriValueProviderFactoryで定義されたValueProvidersを使ってURIから特定のパラメータを取得せよ」と指示するショートカット的な役割を果たします。この属性自体はsealed(継承不可)として定義されているため、それ以上拡張することはできませんが、カスタムのIUriValueProviderFactoryであれば必要な数だけ追加することが可能です。

一方、[FromBody]属性はParameterBindingAttributeクラスを継承しており、HTTPリクエストのボディからパラメータおよびそのプロパティへ値を設定するために使用されます。ASP.NETランタイムは、リクエストボディの読み取り処理をインプットフォーマッターに委譲します。なお、[FromBody]を複合型のパラメータに適用した場合、そのプロパティに付けられたバインディングソース属性はすべて無視されるという点に注意が必要です。

FromUri属性の使用例

以下は、Getアクションメソッドのパラメータに[FromUri]属性を適用した例です。

using System.Collections.Generic;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
    public class DemoController : ApiController{
        public IEnumerable<string> Get([FromUri] string id, [FromUri] string name){
            return new string[]{
                $"The Id of the Student is {id}",
                $"The Name of the Student is {name}"
            };
        }
    }
}

上記の例では、URIにidとnameの値を渡すことで、Getメソッド内の対応する変数にそれぞれの値が設定されます。

https://localhost:58174/api/demo?id=1&name=Mark

実行結果

上記コードの出力結果は以下の通りです。

C# ASP.NET Web APIにおけるFromBody属性とFromUri属性の違いとは?

FromBody属性の使用例

次に、以下のプロパティを持つStudentモデルを作成します。

namespace DemoWebApplication.Models{
    public class Student{
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

コントローラーコード

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
    public class DemoController : ApiController{
        public IEnumerable<string> Get([FromBody] Student student){
            return new string[]{
                $"The Id of the Student is {student.Id}",
                $"The Name of the Student is {student.Name}"
            };
        }
    }
}

上記の例では、studentの値はリクエストボディ経由で渡され、Studentオブジェクトの対応する各プロパティに自動的にマッピングされます。以下は、Postmanを使用した場合のリクエストとレスポンスの例です。

C# ASP.NET Web APIにおけるFromBody属性とFromUri属性の違いとは?

  1. HTMLのid属性とname属性の違いとは?使い分けのポイントをわかりやすく解説

    HTMLのid属性とname属性の違いとは?HTMLには要素を識別するための属性として「id」と「name」があります。どちらも似た役割に見えますが、実際には用途も参照方法もまったく異なります。この記事では、それぞれの特徴と使い分けのポイントをわかりやすく解説します。id属性とはid属性は、フォーム要素を含むHTML要素に一意の識別子を付与するための属性です。idはあくまで「識別」のためのものであり、要素が保持するデータそのものとは関係ありません。主にJavaScriptやCSSで要素を指定・操作する際に使用されます。JavaScriptからは document.getElementById(

  2. HTMLのnovalidate属性とformnovalidate属性の違いを徹底解説!使い分けのポイントとは?

    HTMLには、フォーム送信時に入力内容の検証(バリデーション)をスキップするための属性が2つ用意されています。それがnovalidate属性とformnovalidate属性です。どちらも「検証を回避する」という目的は同じですが、適用対象と動作のタイミングが異なります。novalidate属性は<form>要素自体に指定し、フォーム全体の入力チェックを無効化します。一方、formnovalidate属性はtype=submitのボタンに指定する属性で、そのボタンが押された場合のみ検証を行わずにフォームを送信できます。HTML novalidate属性とはnovalidate属性は、