WebAPIでIHttpActionResultインターフェイスを使用することについての私の2セント
MicrosoftのWebAPIは、かなり長い間、HTTP上で機能するRESTfulサービスを構築するために選択されるフレームワークでした。IHttpActionResultインターフェースはWebAPIバージョン2で導入され、WebAPIコントローラーメソッドから応答を送り返す別の方法を提供し、デフォルトで非同期と待機を利用します。
基本的に、IHttpActionResultはHttpResponsemessageのファクトリです。IHttpActionResultインターフェイスはSystem.Web.Http名前空間に含まれており、HttpResponseMessageのインスタンスを非同期で作成します。IHttpActionResultは、Ok、BadRequest、Exception、Conflict、Redirect、NotFound、およびUnauthorizedを含むカスタムの組み込み応答のコレクションで構成されます。
IHttpActionResultインターフェイスには、メソッドが1つだけ含まれています。このインターフェースは次のようになります。
namespace System.Web.Http
{
public interface IHttpActionResult
{
Task ExecuteAsync(CancellationToken cancellationToken);
}
}
以下にリストされているApiControllerクラスのヘルパーメソッドのいずれかを使用して、カスタム応答を返すことができます。
Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
WebAPIコントローラーメソッドからの応答を返す
このセクションでは、IHttpActionResultを活用してコントローラーメソッドから応答を送り返す方法について説明します。
ここで、次のWebApiコントローラーについて考えてみます。
public class DefaultController : ApiController
{
private readonly DemoRepository repository = new DemoRepository();
public HttpResponseMessage Get(int id)
{
var result = repository.GetData(id);
if (result != null)
return Request.CreateResponse(HttpStatusCode.OK, result);
return Request.CreateResponse(HttpStatusCode.NotFound);
}
}
いずれの場合も適切なステータスコードが返されることに注意してください。つまり、データが利用可能な場合はHttpStatusCode.OKが返され、データが利用できない場合はHttpStatusCode.NotFoundが返されます。
同じコントローラーメソッドを変更して、応答をIHttpActionResultとして返す方法を見てみましょう。参考までに、コントローラーメソッドの更新されたコードを次に示します。HttpResponseMessageがIHttpActionResultに置き換えられていることに注意してください。
public IHttpActionResult Get(int id)
{
var result = repository.GetData(id);
if (result == null)
return NotFound();
return Ok(result);
}
上記のGetメソッドを参照してください。コードは非常にシンプルで無駄がなく、コントローラーでHttpメッセージが実際に作成される方法を抽象化します。そして、ここに別の例があります。
成功または失敗を報告するには、HttpResponseMessageを返す次のコードスニペットを参照してください。
public HttpResponseMessage Delete(int id)
{
var status = repository.Delete(id);
if (status)
return new HttpResponseMessage(HttpStatusCode.OK);
return new HttpResponseMessage(HttpStatusCode.NotFound);
}
ここで、IHttpActionResultを使用して同じアクションメソッドをリファクタリングして、コードをよりスリムでシンプルにする方法を確認します。
public IHttpActionResult Delete(int id)
{
var status = repository.Delete(id);
if (status)
return Ok();
return NotFound();
}
どちらを使用する必要があり、その理由は何ですか?
したがって、応答を返送するときに、WebAPIコントローラーのHttpResponseMessageではなくIHttpActionResultを使用する必要がありますか?これがこの質問に対する私の答えです。そうすることで、コントローラーの単体テストが単純化されるので、私は常にHttpResponseMessageよりもIHttpActionResultを好みます。 Http応答を作成するための共通ロジックを他のクラスに移動し、コントローラーメソッドをスリムでシンプルにすることができます。本質的に、Http応答の作成に関する低レベルの詳細はカプセル化されます。
別の注意点として、IHttpActionResultを使用する場合、単一責任の原則に従うことができ、アクションメソッドはHttp応答メッセージを作成するのではなくHttp要求の処理に集中できることに注意してください。言及する価値のある別のポイントがあります。IHttpActionResultを利用して、RazorでHTMLのサポートを提供できます。あなたがする必要があるのは、Razorビューを解析できるカスタムアクション結果を作成することです。カスタムアクションの結果を作成するのは簡単です。IHttpActionResultインターフェイスを拡張してから、独自のバージョンのExecuteAsyncメソッドを実装する必要があります。