Cara mengembalikan data dari ASP.NET Core Web API

Kami memiliki tiga cara untuk mengembalikan data dan kode status HTTP dari metode tindakan di ASP.NET Core. Anda bisa mengembalikan tipe tertentu, mengembalikan instance tipe IActionResult, atau mengembalikan instance tipe ActionResult. 

Meskipun mengembalikan tipe tertentu adalah cara termudah, IActionResult memungkinkan Anda mengembalikan data dan kode HTTP, dan ActionResult memungkinkan Anda mengembalikan tipe yang memperluas IActionResult. ActionResult dapat digunakan untuk mengirim kode status HTTP, data, atau keduanya dari metode tindakan.

Artikel ini menyajikan diskusi tentang bagaimana kami dapat mengembalikan data di ASP.NET Core Web API menggunakan masing-masing jenis tersebut, dengan contoh kode yang relevan di C #. 

Untuk bekerja dengan contoh kode yang diilustrasikan dalam artikel ini, Anda harus menginstal Visual Studio 2019 di sistem Anda. Jika Anda belum memiliki salinannya, Anda dapat mengunduh Visual Studio 2019 di sini. 

Buat proyek ASP.Net Core API

Pertama, mari buat proyek ASP.NET Core di Visual Studio. Dengan asumsi Visual Studio 2019 diinstal di sistem Anda, ikuti langkah-langkah yang diuraikan di bawah ini untuk membuat proyek ASP.NET Core baru di Visual Studio.

  1. Luncurkan Visual Studio IDE.
  2. Klik "Buat proyek baru".
  3. Di jendela "Buat proyek baru", pilih "Aplikasi Web Inti ASP.Net" dari daftar templat yang ditampilkan.
  4. Klik Next.
  5. Di jendela "Configure your new project", tentukan nama dan lokasi untuk proyek baru tersebut.
  6. Klik Buat.
  7. Di jendela "Buat Aplikasi Web ASP.Net Core Baru" yang ditampilkan berikutnya, pilih .NET Core sebagai runtime dan ASP.NET Core 2.2 (atau yang lebih baru) dari daftar drop-down di bagian atas. Saya akan menggunakan ASP.NET Core 3.0 di sini.
  8. Pilih "API" sebagai template proyek untuk membuat aplikasi ASP.NET Core API baru.
  9. Pastikan kotak centang "Aktifkan Dukungan Docker" dan "Konfigurasi untuk HTTPS" tidak dicentang karena kami tidak akan menggunakan fitur tersebut di sini.
  10. Pastikan Autentikasi disetel sebagai "Tanpa Autentikasi" karena kami juga tidak akan menggunakan autentikasi.
  11. Klik Buat.

Ini akan membuat proyek ASP.NET Core API baru di Visual Studio. Sekarang pilih folder solusi Pengendali di Jendela Penjelajah Solusi dan klik "Add -> Controller ..." untuk membuat pengontrol baru bernama DefaultController. Kami akan menggunakan proyek ini untuk menjelajahi data yang dikembalikan dari metode tindakan di bagian selanjutnya dari artikel ini.

Jika Anda ingin cara mudah untuk menguji metode tindakan yang kami gunakan di bawah ini, saya sarankan memanfaatkan Postman. Anda dapat mendownload salinan Postman dari sini. 

Membuat kelas Controller dan Model di ASP.NET Core

Buat folder solusi baru dan beri nama Model. Di sinilah Anda akan menempatkan kelas model Anda. Daftar kode berikut menggambarkan bagaimana Anda dapat membuat kelas model sederhana bernama Penulis.

kelas publik Penulis

    {

        public int Id {get; set; }

        string publik FirstName {get; set; }

        string publik LastName {get; set; }

    }

Sejauh ini bagus. Sekarang, ganti kode yang dihasilkan dari kelas DefaultController dengan daftar kode yang diberikan di bawah ini.

menggunakan Microsoft.AspNetCore.Mvc;

menggunakan System.Collections.Generic;

namespace CoreWebAPI.Controllers

{

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

    [ApiController]

    kelas publik DefaultController: ControllerBase

    {

        pribadi hanya baca Penulis Daftar = Daftar baru ();

        public DefaultController ()

        {

            penulis.Tambahkan (Penulis baru ()

            {

                Id = 1,

                FirstName = "Joydip",

                LastName = "Kanjilal"

            });

            penulis.Tambahkan (Penulis baru ()

            {

                Id = 2,

                FirstName = "Steve",

                LastName = "Smith"

            });

        }

        [HttpGet]

        publik IEnumerable Get ()

        {

            penulis kembali;

        }

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

        publik Penulis Dapatkan (int id)

        {

            kembali penulis.Temukan (x => x.Id == id);

        }

    }

}

Kembalikan jenis tertentu dari metode tindakan di ASP.NET Core

Cara paling sederhana untuk mengembalikan data dari metode tindakan adalah dengan mengembalikan tipe tertentu. Dalam daftar kode yang ditunjukkan di atas, metode Get action mengembalikan daftar instance Author. Instance ini dibuat dan diinisialisasi dalam konstruktor kelas DefaultController. Di bawah ini adalah metode tindakan lagi untuk referensi Anda. Perhatikan bahwa ia mengembalikan IEnumerable. 

[HttpGet]

publik IEnumerable Get ()

{

   penulis kembali;

}

Dimulai dengan ASP.NET Core 3.0, Anda juga memiliki opsi untuk mengembalikan IAsyncEnumerable dari metode tindakan. Saat IEnumerable melakukan iterasi kumpulan sinkron, IAsyncEnumerable melakukan iterasi asinkron. Jadi IAsyncEnumerable lebih efisien karena tidak ada panggilan yang memblokir. (Saya akan membahas IAsyncEnumerable lebih lanjut di posting mendatang di sini.)

Berikut adalah bagaimana Anda dapat menulis ulang metode tindakan sebelumnya menggunakan IAsyncEnumerable.

[HttpGet]

public async IAsyncEnumerable Get ()

{

   var penulis = menunggu GetAuthors ();

   await foreach (penulis var di penulis)

   {

        menghasilkan pengembalian penulis;

   }

}

Kembalikan contoh tipe IActionResult dari metode tindakan di ASP.NET Core

Anda dapat memanfaatkan antarmuka IActionResult saat Anda ingin mengembalikan data dan kode HTTP dari metode tindakan Anda. Potongan kode berikut menggambarkan bagaimana hal ini dapat dicapai.

[HttpGet]

publik IActionResult Get ()

{

  jika (penulis == null)

      return NotFound ("Tidak ada catatan");

  kembali Ok (penulis);

}

Antarmuka IActionResult diimplementasikan oleh kelas OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult, dan UnsupportedMediaTypeResult.

Dalam potongan kode sebelumnya, metode NotFound () dan Ok () mengembalikan instance tipe IActionResult.

Kembalikan contoh jenis ActionResult dari metode tindakan di ASP.NET Core

ActionResult diperkenalkan di ASP.NET Core 2.1. ActionResult adalah tipe yang mengimplementasikan antarmuka IActionResult. Anda bisa memanfaatkan tipe pengembalian ActionResult untuk mengembalikan tipe yang memperluas ActionResult atau tipe spesifik lainnya (seperti Penulis dalam contoh kami).

Cuplikan kode berikut mengilustrasikan bagaimana kita dapat mengembalikan ActionResult dari metode tindakan.

[HttpGet]

publik ActionResult Dapatkan()

{

  jika (penulis == null)

       return NotFound ("Tidak ada catatan");

   penulis kembali;

}

Seperti yang Anda lihat di cuplikan kode sebelumnya, Anda tidak perlu lagi membungkus objek untuk dikembalikan dalam metode Ok () - Anda bisa mengembalikannya apa adanya.

Sekarang mari buat ini asinkron. Pertimbangkan metode asinkron berikut, yang mengembalikan daftar penulis.

Tugas asinkron pribadi
   
     GetAuthors ()
    

{

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

    penulis kembali;

}

Metode asinkron harus memiliki minimal satu pernyataan await. Jika tidak memiliki pernyataan await, kompilator akan menghasilkan peringatan yang menyatakan bahwa metode tersebut akan berjalan secara sinkron. Untuk menghindari peringatan compiler ini, saya telah menunggu panggilan ke metode Task.Delay di potongan kode sebelumnya.

Metode tindakan yang diperbarui tercantum di bawah ini. Perhatikan bagaimana kata kunci await telah digunakan untuk menjalankan metode async yang baru saja kita buat.

[HttpGet]

Tugas asinkron publik > Dapatkan ()

{

   var data = menunggu GetAuthors ();

   jika (data == null)

        return NotFound ("Tidak ada catatan");

   mengembalikan data;

}

Anda juga dapat mengembalikan instance ActionResult kustom dari metode tindakan Anda. Yang perlu Anda lakukan hanyalah membuat kelas yang mengimplementasikan antarmuka IActionResult dan mengimplementasikan metode ExecuteResultAsync. Kami akan membahas IActionResult dan ActionResult serta kelas ActionResult kustom dalam posting mendatang di sini.