Programmering

Sådan returneres data fra ASP.NET Core Web API

Vi har tre måder at returnere data og HTTP-statuskoder fra en handlingsmetode i ASP.NET Core. Du kan returnere en bestemt type, returnere en forekomst af typen IActionResult eller returnere en forekomst af typen ActionResult.

Selvom returnering af en bestemt type er den enkleste måde, giver IActionResult dig mulighed for at returnere både data og HTTP-koder, og ActionResult giver dig mulighed for at returnere en type, der udvider IActionResult. Et ActionResult kan bruges til at sende en HTTP-statuskode, data eller begge dele fra en handlingsmetode.

Denne artikel præsenterer en diskussion af, hvordan vi kan returnere data i ASP.NET Core Web API ved hjælp af hver af disse typer med relevante kodeeksempler i C #.

For at arbejde med kodeeksemplerne, der er illustreret i denne artikel, skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et ASP.Net Core API-projekt

Lad os først starte med at oprette et ASP.NET Core-projekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge trinene beskrevet nedenfor for at oprette et nyt ASP.NET Core-projekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "ASP.Net Core Web Application" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt" skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.
  7. I vinduet "Opret nyt ASP.Net Core-webapplikation", der vises derefter, skal du vælge .NET Core som runtime og ASP.NET Core 2.2 (eller nyere) fra rullelisten øverst. Jeg bruger ASP.NET Core 3.0 her.
  8. Vælg “API” som projektskabelon for at oprette en ny ASP.NET Core API-applikation.
  9. Sørg for, at afkrydsningsfelterne "Aktivér Docker-support" og "Konfigurer til HTTPS" ikke er markeret, da vi ikke bruger disse funktioner her.
  10. Sørg for, at godkendelse er indstillet som "Ingen godkendelse", da vi heller ikke bruger godkendelse.
  11. Klik på Opret.

Dette opretter et nyt ASP.NET Core API-projekt i Visual Studio. Vælg nu Controllers-løsningsmappen i Solution Explorer-vinduet, og klik på "Tilføj -> Controller ..." for at oprette en ny controller ved navn DefaultController. Vi bruger dette projekt til at udforske returnering af data fra handlingsmetoder i de efterfølgende afsnit i denne artikel.

Hvis du vil have en nem måde at teste de handlingsmetoder, vi bruger nedenfor, anbefaler jeg at udnytte Postman. Du kan downloade en kopi af Postman herfra.

Opret controller- og modelklasser i ASP.NET Core

Opret en ny løsningsmappe, og navngiv den Modeller. Det er her, du placerer dine modelklasser. Følgende kodeliste illustrerer, hvordan du kan oprette en simpel modelklasse med navnet Forfatter.

offentlig klasse Forfatter

    {

public int Id {get; sæt; }

offentlig streng Fornavn {get; sæt; }

public string LastName {get; sæt; }

    }

Så langt så godt. Udskift nu den genererede kode i klassen DefaultController med nedenstående kodeliste.

ved hjælp af Microsoft.AspNetCore.Mvc;

ved hjælp af System.Collections.Generic;

navneområde CoreWebAPI.Controllers

{

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

[ApiController]

offentlig klasse DefaultController: ControllerBase

    {

private readonly Listeforfattere = ny liste ();

offentlig DefaultController ()

        {

author.Add (ny forfatter ()

            {

Id = 1,

FirstName = "Joydip",

LastName = "Kanjilal"

            });

author.Add (ny forfatter ()

            {

Id = 2,

FirstName = "Steve",

LastName = "Smith"

            });

        }

[HttpGet]

offentlig IEnumerable Get ()

        {

returnere forfattere;

        }

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

offentlig forfatter Get (int id)

        {

returnere forfattere.Find (x => x.Id == id);

        }

    }

}

Returner en bestemt type fra en handlingsmetode i ASP.NET Core

Den enkleste måde, du kan returnere data fra en handlingsmetode er at returnere en bestemt type. I kodelisten vist ovenfor returnerer Get-handlingsmetoden en liste over forfatterforekomster. Disse forekomster oprettes og initialiseres i konstruktøren af ​​klassen DefaultController. Nedenfor er handlingsmetoden igen til din reference. Bemærk, at det returnerer IEnumrerable.

[HttpGet]

offentlig IEnumerable Get ()

{

returnere forfattere;

}

Fra og med ASP.NET Core 3.0 har du også mulighed for at returnere IAsyncEnumerable fra en handlingsmetode. Mens IEnumerable udfører en synkron samling iteration, gør IAsyncEnumerable en asynkron iteration. Således er IAsyncEnumerable mere effektiv, fordi der ikke er nogen blokerende opkald. (Jeg vil diskutere IAsyncEnumerable yderligere i et fremtidigt indlæg her.)

Her er hvordan du kan omskrive den foregående handlingsmetode ved hjælp af IAsyncEnumerable.

[HttpGet]

offentlig asynkronisering IAsyncEnumerable Get ()

{

var forfattere = afventer GetAuthors ();

afvente foreach (var forfatter i forfattere)

   {

udbytte afkast forfatter;

   }

}

Returner en forekomst af typen IActionResult fra en handlingsmetode i ASP.NET Core

Du kan drage fordel af IActionResult-grænsefladen, når du gerne vil returnere både data og HTTP-koder fra din handlingsmetode. Følgende kodestykke illustrerer, hvordan dette kan opnås.

[HttpGet]

offentlig IActionResult Get ()

{

hvis (forfattere == null)

returnere NotFound ("Ingen poster");

returnere Ok (forfattere);

}

IActionResult-grænsefladen implementeres af OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult og UnsupportedMediaTypeResult-klasser.

I det foregående kodestykke returnerer metoderne NotFound () og Ok () forekomster af typen IActionResult.

Returner en forekomst af typen ActionResult fra en handlingsmetode i ASP.NET Core

ActionResult blev introduceret i ASP.NET Core 2.1. En ActionResult er en type, der implementerer IActionResult-grænsefladen. Du kan drage fordel af ActionResult-returtypen for at returnere en type, der udvider ActionResult eller en hvilken som helst anden specifik type (såsom forfatter i vores eksempel).

Følgende kodestykke illustrerer, hvordan vi kan returnere ActionResult fra en handlingsmetode.

[HttpGet]

offentlig ActionResult Få()

{

hvis (forfattere == null)

returnere NotFound ("Ingen poster");

returnere forfattere;

}

Som du kan se i det foregående kodestykke, behøver du ikke længere at pakke det objekt, der skal returneres, i Ok () -metoden - du kan bare returnere den som den er.

Lad os nu gøre dette asynkront. Overvej følgende asynkroniseringsmetode, som returnerer listen over forfattere.

privat asynkopgave GetAuthors ()

{

afventer Task.Delay (100) .ConfigureAwait (false);

returnere forfattere;

}

En asynkron metode skal have mindst en afventende erklæring. Hvis den ikke har nogen ventede udsagn, genererer compileren en advarsel om, at metoden kører synkront. For at undgå denne kompilatoradvarsel har jeg afventet et opkald til Task.Delay-metoden i det foregående kodestykke.

Den opdaterede handlingsmetode er angivet nedenfor. Bemærk, hvordan det afventede nøgleord er blevet brugt til at påberåbe den async-metode, vi lige har oprettet.

[HttpGet]

offentlig asynkopgave<>> Hent ()

{

var data = afventer GetAuthors ();

hvis (data == null)

returnere NotFound ("Ingen rekord");

returnere data

}

Du kan også returnere en forekomst af et tilpasset ActionResult fra din handlingsmetode. Alt hvad du behøver at gøre er at oprette en klasse, der implementerer IActionResult-interface og implementerer ExecuteResultAsync-metoden. Vi diskuterer IActionResult og ActionResult samt tilpassede ActionResult-klasser i et fremtidigt indlæg her.