Latihan - Menambahkan pengontrol

Selesai

Pengontrol adalah kelas publik dengan satu atau beberapa metode publik yang dikenal sebagai tindakan. Berdasarkan konvensi, pengontrol ditempatkan di direktori Pengontrol akar proyek. Tindakan diekspos sebagai titik akhir HTTP di dalam pengontrol API web.

Membuat pengontrol

  1. Pilih folder Pengontrol di Visual Studio Code dan tambahkan file baru bernama PizzaController.cs.

    Screenshot of Visual Studio Code that shows adding a new file to the Controllers folder.

    File kelas kosong bernama PizzaController.cs dibuat di direktori Pengontrol. Nama direktori Pengontrol adalah konvensi. Nama direktori berasal dari arsitektur model-view-controller yang digunakan API web.

    Catatan

    Berdasarkan konvensi, nama kelas pengontrol diafiks dengan Pengontrol.

  2. Tambahkan kode berikut ke Controllers/PizzaController.cs. Simpan perubahan.

    using ContosoPizza.Models;
    using ContosoPizza.Services;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class PizzaController : ControllerBase
    {
        public PizzaController()
        {
        }
    
        // GET all action
    
        // GET by Id action
    
        // POST action
    
        // PUT action
    
        // DELETE action
    }
    

    Seperti yang Anda pelajari sebelumnya, kelas ini berasal dari ControllerBase, kelas dasar untuk bekerja dengan permintaan HTTP di ASP.NET Core. Ini juga mencakup dua atribut standar yang telah Anda pelajari: [ApiController] dan [Route]. Seperti sebelumnya, atribut [Route] mendefinisikan pemetaan ke token [controller]. Karena kelas pengontrol ini bernama PizzaController, pengontrol ini menangani permintaan ke https://localhost:{PORT}/pizza.

Dapatkan semua pizza

Kata kerja REST pertama yang perlu Anda terapkan adalah GET, di mana klien bisa mendapatkan semua pizza dari API. Anda dapat menggunakan atribut bawaan [HttpGet] untuk menentukan metode yang mengembalikan pizza dari layanan kami.

Ganti komentar // GET all action di Controllers/PizzaController.cs dengan kode berikut:

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

Tindakan sebelumnya:

  • Hanya merespons kata kerja HTTP GET, seperti yang dilambangkan dengan atribut [HttpGet].
  • Mengembalikan instans ActionResult jenis List<Pizza>. Jenisnya ActionResult adalah kelas dasar untuk semua tindakan menghasilkan ASP.NET Core.
  • Kueri layanan untuk semua pizza dan secara otomatis mengembalikan data dengan nilai Content-Type application/json.

Mengambil satu pizza

Klien mungkin juga ingin meminta informasi tentang pizza tertentu alih-alih seluruh daftar. Anda dapat menerapkan tindakan GET lain yang memerlukan parameter id. Anda dapat menggunakan atribut bawaan [HttpGet("{id}")] untuk menentukan metode yang mengembalikan pizza dari layanan kami. Logika perutean mendaftarkan [HttpGet] (tanpa id) dan [HttpGet("{id}")] (dengan id) sebagai dua rute yang berbeda. Anda kemudian dapat menulis tindakan terpisah untuk mengambil satu item.

Ganti komentar // GET by Id action di Controllers/PizzaController.cs dengan kode berikut:

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

Tindakan sebelumnya:

  • Hanya merespons kata kerja HTTP GET, seperti yang dilambangkan dengan atribut [HttpGet].
  • Mengharuskan nilai parameter id disertakan dalam segmen URL setelah pizza/. Ingat, atribut tingkat-pengontrol [Route] mendefinisikan pola /pizza.
  • Kueri database untuk pizza yang cocok dengan parameter id yang disediakan.

Setiap instans ActionResult yang digunakan dalam tindakan sebelumnya dipetakan ke kode status HTTP yang sesuai dalam tabel berikut:

Inti ASP.NET
hasil tindakan
Kode status HTTP Deskripsi
Ok tersirat 200 Produk yang cocok dengan parameter id yang disediakan ada di cache dalam memori.
Produk disertakan dalam badan respons dalam jenis media, sebagaimana didefinisikan dalam accept header permintaan HTTP (JSON secara default).
NotFound 404 Produk yang cocok dengan parameter id yang diberikan tidak ada di cache dalam memori.

Membangun dan menjalankan pengontrol baru

Bangun dan mulai API web dengan menjalankan perintah berikut:

dotnet run

Menguji pengontrol dengan file .http

  1. Buka ContosoPizza.http

  2. Tambahkan GET baru untuk memanggil Pizza titik akhir di bawah pemisah###:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Pilih perintah Kirim Permintaan di atas panggilan GET baru ini.

    Perintah sebelumnya mengembalikan daftar semua pizza di JSON:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 16:57:09 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]   
    
  4. Untuk mengkueri satu pizza, Anda dapat membuat permintaan GET lain tetapi meneruskan parameter id dengan menggunakan perintah berikut:

    GET {{ContosoPizza_HostAddress}}/pizza/1
    Accept: application/json
    
    ###
    

    Perintah sebelumnya mengembalikan Classic Italian dengan keluaran berikut:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  5. API kami juga menghandel situasi di mana item tidak ada. Panggil API lagi, tetapi teruskan parameter pizza id yang tidak valid dengan menggunakan perintah berikut:

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    Perintah sebelumnya mengembalikan kesalahan 404 Not Found dengan output berikut:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    

Anda sekarang telah selesai menerapkan kata kerja GET. Di unit berikutnya, Anda dapat menambahkan lebih banyak tindakan ke PizzaController untuk mendukung operasi CRUD pada data pizza.

Opsional: Uji pengontrol dengan COMMAND Line HTTP REPL

  1. Buka terminal httprepl yang ada, atau buka terminal terintegrasi baru dari Visual Studio Code dengan memilih Terminal>Terminal Baru dari menu utama.

  2. Sambungkan ke API web kami dengan menjalankan perintah berikut:

    httprepl https://localhost:{PORT}
    

    Sebagai alternatif, jalankan perintah berikut kapan saja saat HttpRepl berjalan:

    connect https://localhost:{PORT}
    
  3. Untuk melihat titik akhir Pizza yang baru tersedia, jalankan perintah berikut:

    ls
    

    Perintah sebelumnya mendeteksi semua API yang tersedia di titik akhir yang terhubung. Seharusnya menampilkan kode berikut:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Buka titik akhir Pizza dengan menjalankan perintah berikut:

    cd Pizza
    

    Perintah sebelumnya menunjukkan output API yang tersedia untuk titik akhir Pizza:

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. Buat permintaan GET di HttpRepl menggunakan perintah berikut:

    get
    

    Perintah sebelumnya mengembalikan daftar semua pizza di JSON:

      HTTP/1.1 200 OK
      Content-Type: application/json; charset=utf-8
      Date: Fri, 02 Apr 2021 21:55:53 GMT
      Server: Kestrel
      Transfer-Encoding: chunked
    
      [
          {
              "id": 1,
              "name": "Classic Italian",
              "isGlutenFree": false
          },
          {
              "id": 2,
              "name": "Veggie",
              "isGlutenFree": true
          }
      ]
    
  6. Untuk mengkueri satu pizza, Anda dapat membuat permintaan GET lain tetapi meneruskan parameter id dengan menggunakan perintah berikut:

    get 1
    

    Perintah sebelumnya mengembalikan Classic Italian dengan keluaran berikut:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  7. API kami juga menghandel situasi di mana item tidak ada. Panggil API lagi, tetapi teruskan parameter pizza id yang tidak valid dengan menggunakan perintah berikut:

    get 5
    

    Perintah sebelumnya mengembalikan kesalahan 404 Not Found dengan output berikut:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    
  8. Kembali ke terminal dotnet dalam daftar tarik-turun di Visual Studio Code dan matikan API web dengan memilih CTRL+C pada keyboard Anda.

Anda sekarang telah selesai menerapkan kata kerja GET. Di unit berikutnya, Anda dapat menambahkan lebih banyak tindakan ke PizzaController untuk mendukung operasi CRUD pada data pizza.