ASP.NET Core API #5: Membuat CRUD untuk Kategori Wisata (GET, POST, PUT, DELETE)
Halo lagi, calon programmer super! 👋
Di artikel sebelumnya kita sudah bisa menghubungkan API dengan database dan mengambil data kategori. Tapi kita baru bisa membaca data (GET). Sekarang kita akan buat API yang bisa menambah, mengubah, dan menghapus data. Di dunia programming, operasi ini disebut CRUD: Create (buat), Read (baca), Update (ubah), Delete (hapus).
Kita akan fokus ke Kategori Wisata dulu. Kita akan buat endpoint-endpoint berikut:
- GET /api/kategori – ambil semua kategori (udah ada).
- GET /api/kategori/{id} – ambil satu kategori berdasarkan id (udah ada).
- POST /api/kategori – tambah kategori baru.
- PUT /api/kategori/{id} – ubah data kategori yang sudah ada.
- DELETE /api/kategori/{id} – hapus kategori.
Langkah 1: Buka Controller Kategori
Buka project WisataAPI di Visual Studio. Cari file KategoriController.cs di folder Controllers. Kita akan tambahkan method-method baru di dalam class ini.
Sekarang isi file KategoriController.cs kita seperti ini (setelah ditambahkan semua method):
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WisataAPI.Data;
using WisataAPI.Models;
namespace WisataAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class KategoriController : ControllerBase
{
private readonly WisataDbContext _context;
public KategoriController(WisataDbContext context)
{
_context = context;
}
// GET: api/kategori
[HttpGet]
public async Task<ActionResult<IEnumerable<KategoriWisata>>> GetKategori()
{
return await _context.KategoriWisata.ToListAsync();
}
// GET: api/kategori/5
[HttpGet("{id}")]
public async Task<ActionResult<KategoriWisata>> GetKategori(int id)
{
var kategori = await _context.KategoriWisata.FindAsync(id);
if (kategori == null)
{
return NotFound();
}
return kategori;
}
// POST: api/kategori
[HttpPost]
public async Task<ActionResult<KategoriWisata>> PostKategori(KategoriWisata kategori)
{
_context.KategoriWisata.Add(kategori);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetKategori), new { id = kategori.Id }, kategori);
}
// PUT: api/kategori/5
[HttpPut("{id}")]
public async Task<IActionResult> PutKategori(int id, KategoriWisata kategori)
{
if (id != kategori.Id)
{
return BadRequest();
}
_context.Entry(kategori).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!KategoriExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// DELETE: api/kategori/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteKategori(int id)
{
var kategori = await _context.KategoriWisata.FindAsync(id);
if (kategori == null)
{
return NotFound();
}
_context.KategoriWisata.Remove(kategori);
await _context.SaveChangesAsync();
return NoContent();
}
private bool KategoriExists(int id)
{
return _context.KategoriWisata.Any(e => e.Id == id);
}
}
}
Wah, panjang ya! Tapi tenang, kita bahas satu per satu.
Langkah 2: POST – Menambah Kategori Baru
Method PostKategori bertugas menerima data kategori baru dari client (Postman) dan menyimpannya ke database.
[HttpPost]
public async Task<ActionResult<KategoriWisata>> PostKategori(KategoriWisata kategori)
{
_context.KategoriWisata.Add(kategori);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetKategori), new { id = kategori.Id }, kategori);
}
Penjelasan:
[HttpPost]– method ini akan dipanggil kalau ada request POST ke/api/kategori.KategoriWisata kategori– data kategori dikirim dalam body request (format JSON). EF Core akan secara otomatis mengisi properti dari JSON._context.KategoriWisata.Add(kategori)– memberitahu EF bahwa kita ingin menambah data baru. Data ini belum masuk database, masih di memory.await _context.SaveChangesAsync()– perintah untuk menyimpan perubahan ke database. Baru di sini data benar-benar tersimpan.return CreatedAtAction(...)– mengembalikan response status 201 Created beserta lokasi data baru (biasanya di header Location) dan data yang baru dibuat.
Uji POST di Postman
- Jalankan API (F5).
- Buka Postman, buat request baru.
- Ubah method menjadi POST.
- Masukkan URL:
https://localhost:7000/api/kategori(sesuaikan port). - Pilih tab Body, pilih raw, dan pilih JSON.
- Ketik data baru, misalnya:
{ "nama": "Taman Hiburan", "deskripsi": "Tempat bermain dan wahana seru" } - Klik Send.
Kalau berhasil, response status 201 Created dan data yang dikirim akan kembali dengan id yang baru (misal id 4). Cek juga di database atau panggil GET all untuk memastikan data masuk.
Langkah 3: PUT – Mengubah Kategori
Method PutKategori digunakan untuk mengupdate data kategori yang sudah ada.
[HttpPut("{id}")]
public async Task<IActionResult> PutKategori(int id, KategoriWisata kategori)
{
if (id != kategori.Id)
{
return BadRequest();
}
_context.Entry(kategori).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!KategoriExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
Penjelasan:
[HttpPut("{id}")]– request PUT ke/api/kategori/3akan memanggil method ini dengan parameter id = 3.if (id != kategori.Id)– memastikan id di URL sama dengan id di body data. Kalau beda, kita anggap request salah (BadRequest)._context.Entry(kategori).State = EntityState.Modified;– memberitahu EF bahwa data ini sudah diubah. Nanti pasSaveChangesAsync, EF akan meng-generate SQL UPDATE.try-catch– menangani kemungkinan data sudah dihapus atau diubah orang lain (konkurensi). Kalau data tidak ada, kita kembalikan NotFound.return NoContent();– kalau sukses, kembalikan status 204 No Content. Biasanya PUT tidak perlu mengembalikan data.
Uji PUT di Postman
- Di Postman, buat request baru, method PUT.
- URL:
https://localhost:7000/api/kategori/4(ganti id dengan id yang baru ditambahkan). - Body raw JSON, misalnya ubah deskripsi:
{ "id": 4, "nama": "Taman Hiburan", "deskripsi": "Tempat bermain, wahana seru, dan konser" } - Klik Send.
Response yang diharapkan: status 204 No Content. Kemudian cek dengan GET untuk memastikan perubahan tersimpan.
Langkah 4: DELETE – Menghapus Kategori
Method DeleteKategori untuk menghapus data berdasarkan id.
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteKategori(int id)
{
var kategori = await _context.KategoriWisata.FindAsync(id);
if (kategori == null)
{
return NotFound();
}
_context.KategoriWisata.Remove(kategori);
await _context.SaveChangesAsync();
return NoContent();
}
Penjelasan:
FindAsync(id)– cari data di database.- Kalau tidak ada, kembalikan 404 NotFound.
Remove(kategori)– hapus dari memory (EF akan menandai untuk dihapus).SaveChangesAsync()– eksekusi penghapusan.- Kembalikan 204 No Content.
Uji DELETE di Postman
- Buat request baru, method DELETE.
- URL:
https://localhost:7000/api/kategori/4(ganti id yang ingin dihapus). - Klik Send.
Response: 204 No Content. Coba GET lagi, data dengan id tersebut sudah hilang.
Langkah 5: Uji Semua Endpoint
Sekarang kita punya 5 endpoint yang bekerja. Coba urutkan pengujian:
- GET /api/kategori – lihat data awal.
- POST – tambah data baru, misal "Taman Hiburan".
- GET /api/kategori/{id} – cek data yang baru.
- PUT – ubah data tersebut.
- DELETE – hapus data tersebut.
- GET lagi untuk memastikan data benar-benar terhapus.
Error yang Mungkin Muncul
- 500 Internal Server Error – biasanya karena koneksi database bermasalah atau ada exception di kode. Cek pesan errornya di Visual Studio (Output window).
- 400 Bad Request – data yang dikirim tidak sesuai, misal id tidak cocok, atau validasi model gagal (misal nama kosong).
- 404 Not Found – data dengan id tersebut tidak ditemukan.
- 409 Conflict – mungkin karena ada duplikat atau constraint database.
Selamat! Kamu Sudah Bisa CRUD!
Sekarang API-mu sudah bisa melakukan operasi dasar terhadap data kategori. Kamu bisa menambah, melihat, mengubah, dan menghapus kategori wisata.
Di artikel selanjutnya (ASP.NET Core API #6), kita akan membuat CRUD untuk Daftar Wisata. Kita akan belajar bagaimana menangani relasi dengan kategori, dan mungkin menambahkan validasi yang lebih canggih. Sampai jumpa!
Ditulis oleh Kakak programmer yang dulu juga sering lupa titik koma. Kalau ada pertanyaan, tulis di komentar ya!