web-dev-qa-db-ja.com

ASP.net Core RC2 Web API POST-Create、CreatedAtAction、またはCreatedAtRouteを使用する場合

これらの機能の基本的な違いは何ですか?私が知っているのは、成功するPOST=リクエストに適切な201の3つの結果すべてです。

私はオンラインで見た例に従うだけですが、彼らは彼らがやっていることをしている理由を本当に説明していません。

GETの名前(IDで1レコード)を提供することになっています。

_[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
     return new ObjectResult(new MyStuff(id));
}
_

以下のPOST関数に「おそらく」必要であることに加えて、このget関数に名前を付ける目的は何ですか?

_[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
     // actual insertion code left out

     return CreatedAtRoute("MyStuff", new { id = myStuff.Id }, myStuff);
}
_

CreatedAtRouteには、ルート名を受け取らないオーバーロードもあります。

同様のパラメーターを受け取るCreatedAtActionもあります。なぜこのバリアントが存在するのですか?

URLと返されるオブジェクトを期待するCreatedもあります。このバリアントを使用して、偽のURLを提供し、必要なオブジェクトを返して、それをやり直すことはできますか?

クライアントに201を返すことができるだけのバリアントが多数ある理由はわかりません。ほとんどの場合、私がしたいのは、「アプリが割り当てた」(おそらくデータベースから)一意のIDまたは最小限の情報を持つエンティティのバージョンを返すことだけです。

最終的に、201応答は、新しく作成されたリソースのURLを含むロケーションヘッダーを「作成」する必要があると思います。常に場所ヘッダーを返す必要があるのはなぜですか?私のJavaScriptクライアント、ネイティブモバイル、デスクトップアプリは決して使用しません。たとえば、請求書を作成してユーザーに送信するためにHTTP POSTを発行した場合、そのようなロケーションURLはどうなりますか? (これに対する答えを見つけるためにインターネットの歴史を深く掘り下げていないことをおMyび申し上げます。)

アクションとルートの名前を作成する理由アクション名とルート名の違いは何ですか?

私はこれについて混乱しているので、POSTには不適切なOk()を返すことに頼りました。これは200を返します。

38
Mickael Caruso

ここにはいくつかの異なる質問があり、それらはおそらく分割されるべきですが、私はこれがあなたの問題の大部分をカバーすると思う.

アクションとルートの名前を作成する理由アクション名とルート名の違いは何ですか?

まず、アクションとルートは非常に異なります。

アクションはコントローラー上に存在します。ルートは、コントローラー、アクション、および潜在的に追加のその他のルートパラメーターで構成される完全なエンドポイントを指定します。

ルートに名前を付けると、アプリケーションで参照できるようになります。例えば

routes.MapRoute(
  name: "MyRouteName",
  url: "SomePrefix/{action}/{id}",
  defaults: new { controller = "Section", action = "Index" }
);

アクション名の理由はこの質問でカバーされています: ActionNameの目的

番号でアクションを開始したり、.netで識別子に許可されていない文字を含めることができます。-最も一般的な理由は、同じ署名(scaffoldedコントローラーのGET/POST削除アクションを参照)

これらの関数の基本的な違いは何ですか?

これら3つの関数はすべて、本質的に同じ機能を実行します-201 Created応答。Locationヘッダーは、新しく作成された応答のURL、および本体内のオブジェクト自体を指します。 urlは、GETリクエストがオブジェクトのURLを返すURLである必要があります。これは、RESTfulシステムでの「正しい」動作と見なされます。

質問の投稿コードの例では、実際にCreatedAtActionを使用します。

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{  
   // actual insertion code left out

   return CreatedAtAction("MyStuff", new { id = myStuff.Id }, myStuff);
}

デフォルトルートが設定されていると仮定すると、これにより、同じコントローラーのMyStuffアクションを指すLocationヘッダーが追加されます。

ロケーションURLが特定のルートを指すようにしたい場合(前に定義したように、たとえば.

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{  
   // actual insertion code left out

   return CreatedAtRoute("MyRouteName", new { id = myStuff.Id }, myStuff);
}

このバリアントを使用して、偽のURLを提供し、目的のオブジェクトを返して完了させることはできますか?

CreatedResultを本当に使用したくない場合は、StatusCodeResultヘッダーまたは本文なしで201を返す単純なLocationを使用できます。

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{  
  // actual insertion code left out

  return StatusCode(201);
}
40
Sock