いくつかの一般的なPOSTおよびGETメソッドで.NET Core 2.1を使用してAPIを作成している場合、これらのメソッドの戻り値の型が最も適しています。ActionResult<T>
またはasync Task<T>
?私の友人の1人は、彼が作成するすべてのAPIで後者を使用しています。これは、私が配置に使用していた会社で使用されたものですが、PluralSiteのチュートリアルでは前者を使用しています。それぞれが何をしているのかは理解していますが、特定のHTTPリクエストに対してどちらを実装する必要があるのかわかりません。
ASP.NET Coreは、Web APIコントローラーアクションの戻り値の型に対して次のオプションを提供します。
Specific type (T)
IActionResult
ActionResult<T>
_Specific
戻り型は、異なる戻り型の可能性をさらにチェックせずにプリミティブまたは複合データ型を返す必要がある場合に適しています(BadRequestResult(400)_,
_ NotFoundResult(404)_, and
_ OkObjectResult(200 ) `。)次のアクションから:
_[HttpGet]
public async Task<List<Product>> GetProducts()
{
return await _repository.GetProductsAsync();
// Here you can not return Ok(products), NotFound() etc;
// If you need to return NotFound() etc then use `IActionResult` instead of Specific type.
}
_
IActionResult
戻り型は、次のようにアクションで複数のActionResult
戻り型が可能な場合に適しています。
_[HttpGet]
public async Task<IActionResult> GetProductById(int id)
{
Product product = await _repository.GetProductByIdAsync(id);
if(product == null)
{
return NotFound(); // Here is one return type
}
return Ok(product); // Here is another return type
}
_
ActionResult
タイプは、さまざまなHTTPステータスコードを表します。このカテゴリに分類される一般的な戻り値の型は、BadRequestResult (400)
、NotFoundResult (404)
、およびOkObjectResult(200)
です。
ActionResult<T>
_タイプ:ASP.NET Core 2.1は、クリーンで記述的なWeb APIの構築を容易にする新しいプログラミング規則を追加します。 _ActionResult<T>
_は、アプリが応答タイプまたはその他のアクション結果(IActionResult
)、応答タイプを示します。
_ActionResult<T>
_はASP.NET Core> = 2.1および_ActionResult<T>
_は、IActionResult
タイプよりも次の利点があります。
[ProducesResponseType]
_属性のTypeプロパティは除外できます。たとえば、[ProducesResponseType(200, Type = typeof(Product))]
は[ProducesResponseType(200)]
に簡略化されます。アクションの期待される戻り値の型は、代わりに_ActionResult<T>
_のT
から推測されます。T
とActionResult
の両方の_ActionResult<T>
_への変換をサポートしています。 T
はObjectResult
に変換されます。つまり、新しい値を返すObjectResult(T);
は_return T;
_に簡略化されます。3番目のソリューション:IActionResultタスク、次のようなもの:
[HttpGet]
[ProducesResponseType(typeof(IList<Currency>), 200)]
public async Task<IActionResult> GetAll()
{
return Ok(await _typeService.GetCurrenciesAsync().ConfigureAwait(false));
}
[HttpGet("{id}", Name = "GetCurrency")]
[ProducesResponseType(typeof(Currency), 200)]
public async Task<IActionResult> Get([FromRoute]int id)
{
return Ok(await _expenseService.GetCurrencyAsync(id).ConfigureAwait(false));
}
Microsoftの例と、代わりにインターフェイスを返す理由をご覧ください。 IActionResult