Kako vratiti podatke s ASP.NET Core Web API-ja

Imamo tri načina za vraćanje podataka i HTTP statusnih kodova iz akcijske metode u ASP.NET Core. Možete vratiti određeni tip, vratiti instancu tipa IActionResult ili instancu tipa ActionResult. 

Iako je vraćanje određene vrste najjednostavniji način, IActionResult omogućuje vraćanje podataka i HTTP kodova, a ActionResult vraćanje tipa koji proširuje IActionResult. ActionResult se može koristiti za slanje HTTP statusnog koda, podataka ili oboje iz metode djelovanja.

Ovaj članak predstavlja raspravu o tome kako možemo vratiti podatke u ASP.NET Core Web API koristeći svaku od tih vrsta, s relevantnim primjerima koda u C #. 

Da biste radili s primjerima koda ilustriranim u ovom članku, u vašem sustavu trebao bi biti instaliran Visual Studio 2019. Ako još nemate kopiju, ovdje možete preuzeti Visual Studio 2019. 

Stvorite ASP.Net Core API projekt

Prvo, kreirajmo ASP.NET Core projekt u Visual Studiju. Pod pretpostavkom da je Visual Studio 2019 instaliran u vašem sustavu, slijedite korake opisane u nastavku da biste u Visual Studiou stvorili novi ASP.NET Core projekt.

  1. Pokrenite Visual Studio IDE.
  2. Kliknite "Stvori novi projekt".
  3. U prozoru "Stvori novi projekt" s popisa predložaka odaberite "ASP.Net Core Web Application".
  4. Kliknite Dalje.
  5. U prozoru „Konfiguriranje novog projekta“ navedite naziv i mjesto za novi projekt.
  6. Kliknite Stvori.
  7. U sljedećem prozoru "Stvaranje nove web-aplikacije ASP.Net Core" odaberite .NET Core kao vrijeme izvođenja i ASP.NET Core 2.2 (ili noviju) s padajućeg popisa na vrhu. Ovdje ću koristiti ASP.NET Core 3.0.
  8. Odaberite "API" kao predložak projekta da biste stvorili novu aplikaciju ASP.NET Core API.
  9. Obavezno označite potvrdne okvire "Omogući podršku za Docker" i "Konfiguriraj za HTTPS" jer ovdje nećemo koristiti te značajke.
  10. Provjerite je li provjera autentičnosti postavljena na "Bez provjere autentičnosti" jer ni mi nećemo koristiti provjeru autentičnosti.
  11. Kliknite Stvori.

To će stvoriti novi ASP.NET Core API projekt u Visual Studiju. Sada odaberite mapu rješenja Controllers u prozoru Solution Explorer i kliknite "Dodaj -> Controller ..." da biste stvorili novi kontroler nazvan DefaultController. Ovaj ćemo projekt koristiti za istraživanje podataka o vraćanju podataka iz akcijskih metoda u sljedećim odjeljcima ovog članka.

Ako želite jednostavan način testiranja akcijskih metoda koje koristimo u nastavku, preporučujem da iskoristite prednost Poštara. Kopiju poštara možete preuzeti ovdje. 

Stvorite klase kontrolera i modela u ASP.NET Core

Stvorite novu mapu rješenja i nazovite je Models. Ovdje ćete smjestiti svoje satove modela. Sljedeći popis kodova ilustrira kako možete stvoriti jednostavnu klasu modela po imenu Author.

javni razred Autor

    {

        javni int Id {get; postavljen; }

        javni niz FirstName {get; postavljen; }

        javni niz LastName {get; postavljen; }

    }

Zasada je dobro. Sada zamijenite generirani kôd klase DefaultController dolje navedenim popisom kodova.

pomoću Microsoft.AspNetCore.Mvc;

pomoću System.Collections.Generic;

prostor imena CoreWebAPI.Controllers

{

    [Ruta ("api / [kontroler]")]

    [ApiController]

    javna klasa DefaultController: ControllerBase

    {

        privatni autori Popisa samo za čitanje = novi Popis ();

        javni DefaultController ()

        {

            autori.Dodaj (novi autor ()

            {

                Id = 1,

                FirstName = "Joydip",

                Prezime = "Kanjilal"

            });

            autori.Dodaj (novi autor ()

            {

                Id = 2,

                FirstName = "Steve",

                Prezime = "Smith"

            });

        }

        [HttpGet]

        javni IEnumerable Get ()

        {

            povratak autora;

        }

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

        javni autor Get (int id)

        {

            vratiti autore.Pronađi (x => x.Id == id);

        }

    }

}

Vratite određeni tip iz metode radnje u ASP.NET Core

Najjednostavniji način na koji možete vratiti podatke iz akcijske metode je vraćanje određene vrste. U gore prikazanom popisu kodova, metoda Dohvati radnju vraća popis instanci autora. Te se instance kreiraju i inicijaliziraju u konstruktoru klase DefaultController. Ispod je opet metoda akcije za vašu referencu. Imajte na umu da vraća IEnumerable. 

[HttpGet]

javni IEnumerable Get ()

{

   povratak autora;

}

Počevši od ASP.NET Core 3.0, također imate mogućnost vraćanja IAsyncEnumerable iz metode radnje. Dok IEnumerable izvodi sinkronu iteraciju zbirke, IAsyncEnumerable vrši asinkronu iteraciju. Stoga je IAsyncEnumerable učinkovitiji jer nema blokiranja poziva. (O IAsyncEnumerable ću raspravljati dalje u sljedećem postu ovdje.)

Evo kako možete ponovo napisati prethodnu metodu radnje pomoću IAsyncEnumerable.

[HttpGet]

javni async IAsyncEnumerable Get ()

{

   var author = await GetAuthors ();

   await foreach (var autor u autorima)

   {

        donosi povrat prinosa;

   }

}

Vrati primjerak tipa IActionResult iz metode akcije u ASP.NET Core

Možete iskoristiti sučelje IActionResult kada želite vratiti podatke i HTTP kodove iz svoje radnje. Sljedeći isječak koda ilustrira kako se to može postići.

[HttpGet]

javni IActionResult Get ()

{

  ako (autori == null)

      return NotFound ("Nema zapisa");

  povratak Ok (autori);

}

Sučelje IActionResult provode klase OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult i UnsupportedMediaTypeResult.

U prethodnom isječku koda, metode NotFound () i Ok () vraćaju instance tipa IActionResult.

Vrati primjerak tipa ActionResult iz metode akcije u ASP.NET Core

ActionResult je predstavljen u ASP.NET Core 2.1. ActionResult je vrsta koja implementira IActionResult sučelje. Možete iskoristiti tip povratka ActionResult da biste vratili tip koji proširuje ActionResult ili bilo koji drugi određeni tip (kao što je Autor u našem primjeru).

Sljedeći isječak koda ilustrira kako možemo vratiti ActionResult iz metode akcije.

[HttpGet]

javni ActionResult Dobiti()

{

  ako (autori == null)

       return NotFound ("Nema zapisa");

   povratak autora;

}

Kao što možete vidjeti u prethodnom isječku koda, više ne morate umotati objekt koji se vraća u metodu Ok () - možete ga jednostavno vratiti onakvog kakav jest.

Učinimo to sada asinkronim. Razmotrite sljedeću asinkronu metodu koja vraća popis autora.

privatni asinkroni zadatak
   
     GetAuthors ()
    

{

    pričekajte Task.Delay (100) .ConfigureAwait (false);

    povratak autora;

}

Asinkrona metoda trebala bi imati najmanje jednu izjavu await. Ako nema nijednu izjavu čeka, sastavljač će generirati upozorenje u kojem se navodi da će se metoda izvoditi sinkrono. Da bih izbjegao ovo upozorenje kompajlera, čekao sam poziv metode Task.Delay u prethodnom isječku koda.

Ažurirana metoda djelovanja navedena je u nastavku. Imajte na umu kako je ključna riječ await korištena za pozivanje async metode koju smo upravo stvorili.

[HttpGet]

javni asinkroni zadatak > Dohvati ()

{

   var podaci = čekati GetAuthors ();

   ako (podaci == null)

        return NotFound ("Nema zapisa");

   vratiti podatke;

}

Iz metode postupka možete vratiti i primjerak prilagođenog ActionResult. Sve što trebate učiniti je stvoriti klasu koja implementira sučelje IActionResult i implementira metodu ExecuteResultAsync. O IActionResult i ActionResult, kao i prilagođenim ActionResult klasama razgovarat ćemo u sljedećem postu ovdje.