Programmering

Hvordan returnere data fra ASP.NET Core Web API

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

Selv om retur av en bestemt type er den enkleste måten, lar IActionResult deg returnere både data og HTTP-koder, og ActionResult lar deg returnere en type som utvider IActionResult. En ActionResult kan brukes til å sende en HTTP-statuskode, data eller begge deler fra en handlingsmetode.

Denne artikkelen presenterer en diskusjon om hvordan vi kan returnere data i ASP.NET Core Web API ved å bruke hver av disse typene, med relevante kodeeksempler i C #.

For å jobbe med kodeeksemplene illustrert i denne artikkelen, bør du ha Visual Studio 2019 installert på systemet ditt. Hvis du ikke allerede har en kopi, kan du laste ned Visual Studio 2019 her.

Opprett et ASP.Net Core API-prosjekt

Først og fremst, la oss lage et ASP.NET Core-prosjekt i Visual Studio. Forutsatt at Visual Studio 2019 er installert i systemet ditt, følger du trinnene som er beskrevet nedenfor for å opprette et nytt ASP.NET Core-prosjekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klikk på "Opprett nytt prosjekt."
  3. I vinduet "Opprett nytt prosjekt" velger du "ASP.Net Core Web Application" fra listen over maler som vises.
  4. Klikk på Neste.
  5. I vinduet "Konfigurer ditt nye prosjekt" angir du navnet og stedet for det nye prosjektet.
  6. Klikk på Opprett.
  7. I vinduet "Opprett nytt ASP.Net Core-webapplikasjon" som vises neste, velger du .NET Core som kjøretid og ASP.NET Core 2.2 (eller senere) fra rullegardinlisten øverst. Jeg bruker ASP.NET Core 3.0 her.
  8. Velg “API” som prosjektmal for å opprette et nytt ASP.NET Core API-program.
  9. Forsikre deg om at avmerkingsboksene "Aktiver Docker-støtte" og "Konfigurer for HTTPS" ikke er merket av da vi ikke bruker disse funksjonene her.
  10. Forsikre deg om at autentisering er angitt som “ingen godkjenning”, da vi heller ikke bruker autentisering.
  11. Klikk på Opprett.

Dette vil opprette et nytt ASP.NET Core API-prosjekt i Visual Studio. Velg nå løsningsmappen for kontrollere i vinduet Solution Explorer og klikk på "Legg til -> kontroller ..." for å opprette en ny kontroller som heter DefaultController. Vi bruker dette prosjektet til å utforske returdata fra handlingsmetoder i de påfølgende delene av denne artikkelen.

Hvis du ønsker en enkel måte å teste handlingsmetodene vi bruker nedenfor, anbefaler jeg å dra nytte av Postman. Du kan laste ned en kopi av Postman herfra.

Lag kontroller- og modellklasser i ASP.NET Core

Opprett en ny løsningsmappe og gi den navn Modeller. Det er her du vil plassere modellklassene dine. Følgende kodeliste illustrerer hvordan du kan lage en enkel modellklasse som heter Forfatter.

offentlig klasse Forfatter

    {

offentlig int Id {get; sett; }

offentlig streng Fornavn {get; sett; }

offentlig streng Etternavn {get; sett; }

    }

Så langt så bra. Nå erstatter du den genererte koden i klassen DefaultController med kodelisten gitt nedenfor.

ved hjelp av Microsoft.AspNetCore.Mvc;

ved hjelp av System.Collections.Generic;

navneområdet 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.Finn (x => x.Id == id);

        }

    }

}

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

Den enkleste måten du kan returnere data fra en handlingsmetode er å returnere en bestemt type. I kodelisten vist ovenfor returnerer Get-handlingsmetoden en liste over forfatterforekomster. Disse forekomstene blir opprettet og initialisert i konstruktøren av klassen DefaultController. Nedenfor er handlingsmetoden igjen for din referanse. Merk at den returnerer IEnumerable.

[HttpGet]

offentlig IEnumerable Get ()

{

returnere forfattere;

}

Fra og med ASP.NET Core 3.0 har du også muligheten til å returnere IAsyncEnumerable fra en handlingsmetode. Mens IEnumerable utfører en synkron samling iterasjon, gjør IAsyncEnumerable en asynkron iterasjon. Dermed er IAsyncEnumerable mer effektivt fordi det ikke er noen blokkerende samtaler. (Jeg vil diskutere IAsyncEnumerable nærmere i et fremtidig innlegg her.)

Slik kan du omskrive den foregående handlingsmetoden ved hjelp av IAsyncEnumerable.

[HttpGet]

offentlig asynkronisering IAsyncEnumerable Get ()

{

var forfattere = venter på GetAuthors ();

avvente foreach (var forfatter i forfattere)

   {

avkastning avkastning forfatter;

   }

}

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

Du kan dra nytte av IActionResult-grensesnittet når du vil returnere både data og HTTP-koder fra handlingsmetoden. Følgende kodebit illustrerer hvordan dette kan oppnås.

[HttpGet]

offentlig IActionResult Get ()

{

hvis (forfattere == null)

returner NotFound ("Ingen poster");

return Ok (forfattere);

}

IActionResult-grensesnittet er implementert av klassene OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult og UnsupportedMediaTypeResult.

I forrige kodebit returnerer metodene NotFound () og Ok () forekomster av type IActionResult.

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

ActionResult ble introdusert i ASP.NET Core 2.1. En ActionResult er en type som implementerer IActionResult-grensesnittet. Du kan dra nytte av ActionResult-returtypen for å returnere en type som utvider ActionResult eller en hvilken som helst annen spesifikk type (for eksempel Author i vårt eksempel).

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

[HttpGet]

offentlig ActionResult Få()

{

hvis (forfattere == null)

returner NotFound ("Ingen poster");

returnere forfattere;

}

Som du kan se i forrige kodebit, trenger du ikke lenger å pakke inn objektet som skal returneres i Ok () -metoden - du kan bare returnere den som den er.

La oss nå gjøre dette asynkront. Vurder følgende asynkroniseringsmetode, som returnerer listen over forfattere.

private async Oppgave GetAuthors ()

{

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

returnere forfattere;

}

En asynkron metode bør ha minst én ventende uttalelse. Hvis den ikke har noen ventende uttalelser, vil kompilatoren generere en advarsel om at metoden vil kjøre synkront. For å unngå denne advarselen om kompilator, har jeg ventet på å ringe til Task.Delay-metoden i forrige kodebit.

Den oppdaterte handlingsmetoden er oppført nedenfor. Legg merke til hvordan det ventede nøkkelordet har blitt brukt til å påkalle async-metoden vi nettopp opprettet.

[HttpGet]

offentlig asynkroniseringsoppgave<>> Få ()

{

var data = venter på GetAuthors ();

hvis (data == null)

returner NotFound ("Ingen post");

returnere data;

}

Du kan også returnere en forekomst av et tilpasset ActionResult fra handlingsmetoden. Alt du trenger å gjøre er å lage en klasse som implementerer IActionResult-grensesnittet og implementerer ExecuteResultAsync-metoden. Vi diskuterer IActionResult og ActionResult samt tilpassede ActionResult-klasser i et fremtidig innlegg her.

$config[zx-auto] not found$config[zx-overlay] not found