Latihan - Menambahkan pengontrol
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
Pilih folder Pengontrol di Visual Studio Code dan tambahkan file baru bernama PizzaController.cs.
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.
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 bernamaPizzaController
, pengontrol ini menangani permintaan kehttps://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
jenisList<Pizza>
. JenisnyaActionResult
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 setelahpizza/
. 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
Buka ContosoPizza.http
Tambahkan GET baru untuk memanggil
Pizza
titik akhir di bawah pemisah###:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
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 } ]
Untuk mengkueri satu pizza, Anda dapat membuat permintaan
GET
lain tetapi meneruskan parameterid
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 }
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
Buka terminal
httprepl
yang ada, atau buka terminal terintegrasi baru dari Visual Studio Code dengan memilih Terminal>Terminal Baru dari menu utama.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}
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]
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]
Buat permintaan
GET
diHttpRepl
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 } ]
Untuk mengkueri satu pizza, Anda dapat membuat permintaan
GET
lain tetapi meneruskan parameterid
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 }
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" }
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.