web-dev-qa-db-ja.com

HttpResponseMessageを返すためのWeb APIベストアプローチ

Web APIプロジェクトがあり、正しいメソッドは常にHttpResponseMessageを返します。

だから、それが機能するか失敗した場合、私は返します:

エラーなし:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed.");

エラーまたは失敗

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process.");

オブジェクトを返すときは、次を使用します。

return Request.CreateResponse(HttpStatusCode.OK, user);

カプセル化されたより良いポーズをHTML5クライアントに返す方法を知りたいので、トランザクションなどに関する情報を返すことができます。

私はHttpResponseMessageをカプセル化できるが、より多くのデータを持つカスタムクラスを作成することを考えていました。

誰かが同様のものを実装していますか?

29
VAAA

これは質問に直接答えているわけではありませんが、役に立つと思われる情報を提供したかったのです。 http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessageは、多かれ少なかれIHttpActionResultに置き換えられました。それははるかにきれいで使いやすいです。

public IHttpActionResult Get()
{
     Object obj = new Object();
     if (obj == null)
         return NotFound();
     return Ok(obj);
 }

その後、カプセル化してカスタムのものを作成できます。 IHttpActionResultを使用するときにカスタムヘッダーを設定する方法

まだカスタム結果を実装する必要性をまだ見つけていませんが、実装したらこのルートを使用します。

おそらく古いものを使用するのと非常によく似ています。

これをさらに拡張し、もう少し情報を提供します。一部のリクエストにメッセージを含めることもできます。例えば。

return BadRequest("Custom Message Here");

他の多くのものでこれを行うことはできませんが、送り返したい一般的なメッセージには役立ちます。

36
Kalel Wade

エラー応答を返して、詳細を提供できます。

public HttpResponseMessage Get()
{
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } };
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
 }

戻ります:

{ 
  "Message": "The file has no content or rows to process.", 
  "CustomErrorCode": 42 
}

詳細はこちら: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

また、 http://en.wikipedia.org/wiki/List_of_HTTP_status_codes を使用して、返すHTTPステータスコードを判断しやすくします。

5
Trisk

重要な注意事項:コンテンツを204応答に入れないでください! HTTP仕様に反するだけでなく、.NETは実際に予期しない動作をする場合があります。

誤ってreturn Request.CreateResponse(HttpStatusCode.NoContent, null);を使用したため、頭痛の種になりました。同じセッションからの今後のリクエストは、"null"応答に付加される文字列値。 .NETは、同じセッションからのAPI呼び出しの応答オブジェクトを常に完全にクリアするとは限りません。

2
BigTone