16

アクションメソッドからの戻り値の型に対するWeb APIの一般的な慣例は何ですか?

次のように CLR オブジェクトを返します。

public IEnumerable<ContactModel> Get()
{
    return _contactService.GetAllForUser();
}

または、オブジェクトを次のようにラップしますHttpResponseMessage

public HttpResponseMessage Get()
{
    IEnumerable<ContactModel> contacts = _contactService.GetAllForUser();

    return Request.CreateResponse((HttpStatusCode) 200, contacts);
}

HttpResponseMessage毎回インスタンス化する必要がないため、明らかにクリーンなメソッドになるため、戻り値の型として独自の CLR オブジェクトを使用することをお勧めします。

4

2 に答える 2

18

ここで重要な点は、この選択はPREFERENCEの問題であるということです。戻り値の型がクライアントによって事前にわかっている「URI スタイル」の HTTP API を作成している場合は、これが望ましい方法です。

ただし、個人的には、CLR 型を返すのは好きではありません。このアプローチを取ると、HTTP の利点の多くが失われる可能性が高いと思います。私は常に HttpResponseMessage を返します。

標準的なプロシージャ コールを考えると、戻り値の型が返されるか、例外が発生するかの 2 つの結果が考えられます。HTTP インタラクションは、リダイレクト、一時的に使用できないサーバー、コンテンツがない、変更されていない、サーバー接続、ヘッダー バリアントの優先などにより、それよりもはるかに柔軟です。

ApiController クラスは、アプリケーションがオブジェクト指向のメソッド呼び出しを HTTP 要求/応答にマップする機会を得る場所だと思います。このマッピングを明示的に行うと、HTTP を利用しやすくなると思います。フレームワークが魔法のように CLR 型を何らかのワイヤ表現に変換できるようにすることで、タイピングをいくらか節約できますが、何が起こっているのかわかりにくくなり、ActionFilters と MessageHandlers を介してあらゆる種類の HTTP 対話を間接的に行う必要があります。

私は、CLR 型を変更して返すことを好む人々を説得することに興味はありません。HttpResponseMessage を返すという考えが好きな人々に、次のような多くのサンプルが表示されないという事実にもかかわらず、完全に実行可能なオプションであることを再保証したいだけです。それ。

于 2012-09-04T14:55:44.290 に答える
4

最初のオプションが最適だと思います。いずれにせよ、エラーがなければリターン コードは 200 で、何も設定しなくても構いません。

例外がある場合は、適切なHttpResponseExceptionコードとメッセージをスローできます

throw new HttpResponseException(
    Request.CreateResponse<string>(HttpStatusCode.BadRequest, 'Your message'))
于 2012-09-04T13:09:46.137 に答える