Gegevens retourneren vanuit ASP.NET Core Web API

We hebben drie manieren om gegevens en HTTP-statuscodes te retourneren vanuit een actiemethode in ASP.NET Core. U kunt een specifiek type retourneren, een exemplaar van het type IActionResult retourneren of een exemplaar van het type ActionResult retourneren. 

Hoewel het retourneren van een specifiek type de eenvoudigste manier is, kunt u met IActionResult zowel gegevens als HTTP-codes retourneren, en met ActionResult kunt u een type retourneren dat IActionResult uitbreidt. Een ActionResult kan worden gebruikt om een ​​HTTP-statuscode, gegevens of beide te verzenden vanuit een actiemethode.

In dit artikel wordt besproken hoe we gegevens in ASP.NET Core Web API kunnen retourneren met elk van deze typen, met relevante codevoorbeelden in C #. 

Om te werken met de codevoorbeelden die in dit artikel worden geïllustreerd, moet Visual Studio 2019 op uw systeem zijn geïnstalleerd. Als u nog geen exemplaar heeft, kunt u Visual Studio 2019 hier downloaden. 

Maak een ASP.Net Core API-project

Laten we eerst een ASP.NET Core-project maken in Visual Studio. Ervan uitgaande dat Visual Studio 2019 op uw systeem is geïnstalleerd, volgt u de onderstaande stappen om een ​​nieuw ASP.NET Core-project in Visual Studio te maken.

  1. Start de Visual Studio IDE.
  2. Klik op "Nieuw project maken".
  3. Selecteer in het venster "Nieuw project maken" de optie "ASP.Net Core Web Application" in de lijst met weergegeven sjablonen.
  4. Klik volgende.
  5. Geef in het venster "Configureer uw nieuwe project" de naam en locatie op voor het nieuwe project.
  6. Klik op Maken.
  7. In het "Create New ASP.Net Core Web Application" -venster dat hierna wordt weergegeven, selecteert u .NET Core als de runtime en ASP.NET Core 2.2 (of hoger) in de vervolgkeuzelijst bovenaan. Ik zal hier ASP.NET Core 3.0 gebruiken.
  8. Selecteer "API" als de projectsjabloon om een ​​nieuwe ASP.NET Core API-applicatie te maken.
  9. Zorg ervoor dat de selectievakjes "Docker-ondersteuning inschakelen" en "Configureren voor HTTPS" niet zijn aangevinkt, aangezien we deze functies hier niet zullen gebruiken.
  10. Zorg ervoor dat Authentication is ingesteld als "No Authentication", aangezien we ook geen authenticatie zullen gebruiken.
  11. Klik op Maken.

Hiermee wordt een nieuw ASP.NET Core API-project gemaakt in Visual Studio. Selecteer nu de controllers oplossingsmap in het Solution Explorer-venster en klik op "Toevoegen -> Controller ..." om een ​​nieuwe controller te maken met de naam DefaultController. We zullen dit project gebruiken om de terugkerende gegevens van actiemethoden in de volgende secties van dit artikel te onderzoeken.

Als je een gemakkelijke manier wilt om de hieronder gebruikte actiemethoden te testen, raad ik je aan om Postman te gebruiken. U kunt hier een kopie van Postman downloaden. 

Maak controller- en modelklassen in ASP.NET Core

Maak een nieuwe oplossingsmap en noem deze Modellen. Hier plaats je je modelklassen. De volgende codelijst illustreert hoe u een eenvoudige modelklasse met de naam Author kunt maken.

public class Auteur

    {

        openbare int Id {get; set; }

        openbare tekenreeks FirstName {get; set; }

        openbare tekenreeks Achternaam {get; set; }

    }

Tot zover goed. Vervang nu de gegenereerde code van de DefaultController-klasse door de onderstaande codelijst.

met behulp van Microsoft.AspNetCore.Mvc;

met behulp van System.Collections.Generic;

naamruimte CoreWebAPI.Controllers

{

    [Route ("api / [controller]")]

    [ApiController]

    openbare klasse DefaultController: ControllerBase

    {

        privé alleen-lezen Lijst auteurs = nieuwe lijst ();

        openbare DefaultController ()

        {

            auteurs.Add (nieuwe auteur ()

            {

                Id = 1,

                FirstName = "Joydip",

                LastName = "Kanjilal"

            });

            auteurs.Add (nieuwe auteur ()

            {

                Id = 2,

                FirstName = "Steve",

                LastName = "Smith"

            });

        }

        [HttpGet]

        openbare IEnumerable Get ()

        {

            auteurs teruggeven;

        }

        [HttpGet ("{id}", Name = "Get")]

        public Author Get (int id)

        {

            terug auteurs.Zoek (x => x.Id == id);

        }

    }

}

Retourneer een specifiek type van een actiemethode in ASP.NET Core

De eenvoudigste manier waarop u gegevens van een actiemethode kunt retourneren, is door een specifiek type te retourneren. In de codelijst die hierboven wordt weergegeven, retourneert de methode Get action een lijst met Author-instanties. Deze instanties worden gemaakt en geïnitialiseerd in de constructor van de DefaultController-klasse. Hieronder vindt u de actiemethode nogmaals ter referentie. Merk op dat het IEnumerable retourneert. 

[HttpGet]

openbare IEnumerable Get ()

{

   auteurs teruggeven;

}

Te beginnen met ASP.NET Core 3.0, heb je ook de mogelijkheid om IAsyncEnumerable te retourneren vanuit een actiemethode. Terwijl IEnumerable een synchrone verzameling-iteratie uitvoert, voert IAsyncEnumerable een asynchrone iteratie uit. IAsyncEnumerable is dus efficiënter omdat er geen blokkerende oproepen zijn. (Ik zal IAsyncEnumerable verder bespreken in een toekomstige post hier.)

Hier ziet u hoe u de voorgaande actiemethode kunt herschrijven met IAsyncEnumerable.

[HttpGet]

openbare async IAsyncEnumerable Get ()

{

   var auteurs = wachten GetAuthors ();

   wachten op foreach (var auteur in auteurs)

   {

        opbrengst terugkeer auteur;

   }

}

Retourneer een instantie van het type IActionResult van een actiemethode in ASP.NET Core

U kunt profiteren van de IActionResult-interface wanneer u zowel gegevens als HTTP-codes van uw actiemethode wilt retourneren. Het volgende codefragment illustreert hoe dit kan worden bereikt.

[HttpGet]

openbare IActionResult Get ()

{

  if (auteurs == null)

      return NotFound ("Geen records");

  retourneer Ok (auteurs);

}

De IActionResult-interface wordt geïmplementeerd door de klassen OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult en UnsupportedMediaTypeResult.

In het voorgaande codefragment retourneren de methoden NotFound () en Ok () instanties van het type IActionResult.

Retourneer een instantie van het type ActionResult van een actiemethode in ASP.NET Core

ActionResult is geïntroduceerd in ASP.NET Core 2.1. Een ActionResult is een type dat de IActionResult-interface implementeert. U kunt profiteren van het ActionResult-retourtype om een ​​type te retourneren dat ActionResult uitbreidt of een ander specifiek type (zoals Author in ons voorbeeld).

Het volgende codefragment illustreert hoe we ActionResult kunnen retourneren vanuit een actiemethode.

[HttpGet]

openbare ActionResult Krijgen()

{

  if (auteurs == null)

       return NotFound ("Geen records");

   auteurs teruggeven;

}

Zoals je kunt zien in het voorgaande codefragment, hoef je het te retourneren object niet langer in de Ok () -methode te verpakken - je kunt het gewoon retourneren zoals het is.

Laten we dit nu asynchroon maken. Beschouw de volgende async-methode, die de lijst met auteurs retourneert.

privé asynchrone taak
   
     GetAuthors ()
    

{

    wacht op Task.Delay (100) .ConfigureAwait (false);

    auteurs teruggeven;

}

Een asynchrone methode moet minimaal één await-instructie hebben. Als het geen wacht-instructies heeft, zal de compiler een waarschuwing genereren dat de methode synchroon zal werken. Om deze compilerwaarschuwing te vermijden, heb ik in het voorgaande codefragment gewacht op een aanroep naar de Task.Delay-methode.

De bijgewerkte actiemethode wordt hieronder vermeld. Merk op hoe het await-sleutelwoord is gebruikt om de asynchrone methode aan te roepen die we zojuist hebben gemaakt.

[HttpGet]

openbare asynchrone taak > Krijg ()

{

   var data = wachten GetAuthors ();

   if (data == null)

        return NotFound ("Geen record");

   gegevens retourneren;

}

U kunt ook een exemplaar van een aangepast ActionResult retourneren vanuit uw actiemethode. Het enige dat u hoeft te doen, is een klasse maken die de IActionResult-interface implementeert en de ExecuteResultAsync-methode implementeert. We zullen IActionResult en ActionResult bespreken, evenals aangepaste ActionResult-klassen in een toekomstige post hier.