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 Anda.
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 Anda pelajari tentang:[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
ActionResultjenisList<Pizza>. JenisnyaActionResultadalah kelas dasar untuk semua tindakan menghasilkan ASP.NET Core. - Kueri layanan untuk semua pizza dan secara otomatis mengembalikan data dengan nilai
Content-Typeapplication/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
iddisertakan dalam segmen URL setelahpizza/. Ingat, atribut tingkat-pengontrol[Route]mendefinisikan pola/pizza. - Kueri database untuk pizza yang cocok dengan parameter
idyang 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
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
GETlain tetapi meneruskan parameteriddengan menggunakan perintah berikut:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###Perintah sebelumnya mengembalikan
Classic Italiandengan 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
idyang tidak valid dengan menggunakan perintah berikut:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###Perintah sebelumnya mengembalikan kesalahan
404 Not Founddengan 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" }
Sekarang setelah Anda selesai mengimplementasikan GET kata kerja. 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 Read-Eval-Print Loop (REPL)
Buka terminal
httpreplyang 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
HttpReplberjalan:connect https://localhost:{PORT}Untuk melihat titik akhir
Pizzayang baru tersedia, jalankan perintah berikut:lsPerintah 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
Pizzadengan menjalankan perintah berikut:cd PizzaPerintah sebelumnya menunjukkan output API yang tersedia untuk titik akhir
Pizza:https://localhost:{PORT}/> cd Pizza /Pizza [GET]Buat permintaan
GETdiHttpReplmenggunakan perintah berikut:getPerintah 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
GETlain tetapi meneruskan parameteriddengan menggunakan perintah berikut:get 1Perintah sebelumnya mengembalikan
Classic Italiandengan 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
idyang tidak valid dengan menggunakan perintah berikut:get 5Perintah sebelumnya mengembalikan kesalahan
404 Not Founddengan 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
dotnetdalam daftar tarik-turun di Visual Studio Code dan matikan API web dengan memilih CTRL+C pada keyboard Anda.
Sekarang setelah Anda selesai mengimplementasikan GET kata kerja. Di unit berikutnya, Anda dapat menambahkan lebih banyak tindakan ke PizzaController untuk mendukung operasi CRUD pada data pizza.