web-dev-qa-db-fra.com

API ASP.NET Core - ActionResult <T> vs async Task <T>

Si je crée une API à l'aide de .NET Core 2.1 avec certaines méthodes POST et GET, le type de retour pour ces méthodes est le plus approprié, ActionResult<T> ou async Task<T>? Un de mes amis utilise ce dernier dans chaque API qu'il crée et c'est ce qui a été utilisé par la société avec laquelle j'étais en stage, tandis que le tutoriel sur PluralSite utilise le premier. Je comprends ce que chacun fait, mais je ne sais pas lequel devrait être implémenté pour une requête HTTP donnée?

8
Calum Mullen

ASP.NET Core offre les options suivantes pour les types de retour d'action du contrôleur API Web:

  • Specific type (T)
  • IActionResult
  • ActionResult<T>

Type spécifique (T):

Le type de retour Specific est approprié lorsque vous devez renvoyer un type de données primitif ou complexe sans vérification supplémentaire avec possibilité de type de retour différent (BadRequestResult (400) , NotFoundResult (404) , and OkObjectResult (200) `.) De l'action comme suit:

[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 type:

Le type de retour IActionResult est approprié lorsque plusieurs types de retour ActionResult sont possibles dans une action comme suit:

[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
}

Les types ActionResult représentent divers codes d'état HTTP. Certains types de retour courants entrant dans cette catégorie sont BadRequestResult (400), NotFoundResult (404) et OkObjectResult(200).

ActionResult<T> Tapez:

ASP.NET Core 2.1 ajoute de nouvelles conventions de programmation qui facilitent la création d'API Web propres et descriptives. ActionResult<T> est un nouveau type ajouté pour permettre à une application de renvoyer un type de réponse ou tout autre résultat d'action (similaire à IActionResult), tout en indiquant le type de réponse.

ActionResult<T> est plus spécifique aux API Web dans ASP.NET Core> = 2.1 et ActionResult<T> offre les avantages suivants par rapport au type IActionResult:

  • La propriété Type de l'attribut [ProducesResponseType] Peut être exclue. Par exemple, [ProducesResponseType(200, Type = typeof(Product))] est simplifiée en [ProducesResponseType(200)]. Le type de retour attendu de l'action est plutôt déduit de T dans ActionResult<T>.
  • Les opérateurs de transtypage implicites prennent en charge la conversion de T et ActionResult en ActionResult<T>. T se convertit en ObjectResult, ce qui signifie que le retour de la nouvelle ObjectResult(T); est simplifié en return T;.

Pour plus de détails: types de retour d'action du contrôleur dans l'API Web ASP.NET Core

10
TanvirArjel

Troisième solution: IActionResult Task, quelque chose comme ceci:

[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));
}

Jetez un œil à un exemple de Microsoft et pourquoi ils retournent l'interface à la place: IActionResult

8
PmanAce