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?
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>
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.
}
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
:
[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>
.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
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