WebAPI の前は、通常の MVC アクション メソッドを使用して、すべてのクライアント側のリモート検証呼び出しを行っていました。WebAPI を使用すると、ApiController で POST、PUT、DELETE、および GET メソッドを使用できるようになりました。ただし、検証はまだ行う必要があります。
リモート検証アクション メソッドを ApiController に配置し、動作させることができました。リソースの POST、PUT、または DELETE を送信する前に、クライアントは 1 つ以上の検証 URL に POST して、ユーザー入力を検証し、適切な検証メッセージを受け取ることができます。
私の質問は、これらのリモート検証アクションは ApiController で行うべきですか? それとも通常の MVC コントローラーですか? それらをすべて ApiController に入れるのが最も理にかなっているように思えます。そのクラスは、リソース (およびリソース コレクション) のミューテーションに関係するすべてをカプセル化できるからです。
更新: @tugberk に返信
詳しく説明する必要があります。まず、DataAnnotations 検証を使用していません。FluentValidation.NET を使用して、ドメイン層コマンドで構成された豊富な検証ルールとメッセージが既にあります。検証クラスの多くは、依存性注入を使用してデータベースを呼び出します (たとえば、一意性を検証するため)。FluentValidation は MVC ModelState との優れたプラグ可能性を備えていますが、WebAPI ModelState にプラグインする良い方法をまだ見つけていません。
次に、POST、PUT、および DELETE エンドポイントで検証を行っています。クライアントは、何が問題なのかを発見するために検証エンドポイントを知る必要はありません。次に例を示します。
var command = Mapper.Map<CreateCarCommand>(carApiModel);
try
{
_createHandler.Handle(command);
}
catch (ValidationException ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
クライアントは、400 応答と、何が問題であったかを示すメッセージを受け取ります。確かに、これはリンク先の例の応答ほど詳細ではありません。文字列を返すだけなので、各検証メッセージが属するフィールドを解析する簡単な方法はありません。これは、API の独自の HTML + JavaScript クライアントに必要です。これが、私がより詳細な検証エンドポイントを追加した理由です (ちなみに、これらは JavaScript クライアントでのフィールド固有のノックアウト検証呼び出しによって消費されます)。