Grup Rute, Parameter & Validasi
Atur endpoint dengan MapGroup, ikat parameter rute/kueri/body, dan lakukan validasi dengan anotasi data.
Grup Rute, Parameter & Validasi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Grup Rute untuk Penataan
MapGroup() (diperkenalkan di .NET 7) memungkinkan Anda mengelompokkan titik akhir terkait di bawah awalan umum dan menerapkan konfigurasi bersama—perangkat tengah, kebijakan autentikasi, label—tanpa mengulanginya pada setiap titik akhir.
Membuat Grup Rute
Panggil app.MapGroup("/api/products"), lalu petakan titik akhir pada grup yang dikembalikan. Awalan tersebut otomatis ditambahkan di depan semua rute.
var products = app.MapGroup("/api/products").WithTags("Products");
products.MapGet("/", GetAll);
products.MapGet("/{id}", GetById);
products.MapPost("/", Create);
products.MapPut("/{id}", Update);
products.MapDelete("/{id}", Delete);
// Routes: /api/products, /api/products/{id}Menerapkan Autentikasi ke Grup
Gunakan RequireAuthorization() pada grup untuk melindungi semua titik akhir sekaligus. Titik akhir individual tetap dapat menggantinya dengan AllowAnonymous().
var adminGroup = app.MapGroup("/admin")
.RequireAuthorization("AdminPolicy")
.WithTags("Admin");
adminGroup.MapGet("/users", GetAllUsers);
adminGroup.MapDelete("/users/{id}", DeleteUser);
// This one inside the group opts out
adminGroup.MapGet("/status", () => "OK").AllowAnonymous();Batasan Parameter Rute
Batasi parameter rute dengan pola tipe. Perute menolak permintaan yang tidak cocok dan secara otomatis mengembalikan 404.
// Only matches numeric IDs
app.MapGet("/products/{id:int}", (int id) => id);
// GUID constraint
app.MapGet("/orders/{orderId:guid}", (Guid orderId) => orderId);
// Length constraint
app.MapGet("/codes/{code:length(6)}", (string code) => code);
// Min value
app.MapGet("/page/{page:min(1)}", (int page) => page);Pengikatan dari Berbagai Sumber
Parameter diikat dari berbagai sumber menggunakan atribut. Secara bawaan, tipe sederhana berasal dari rute/kueri, sedangkan tipe kompleks berasal dari isi.
app.MapPost("/search", (
[FromQuery] string q,
[FromQuery] int page,
[FromHeader(Name = "X-Api-Version")] string version,
[FromBody] SearchFilters filters,
AppDbContext db) =>
{
// q and page from query string
// version from request header
// filters from JSON body
return Results.Ok();
});Pengikatan Parameter Khusus dengan TryParse
Untuk tipe khusus yang digunakan sebagai parameter rute atau kueri, implementasikan metode statis TryParse. Kerangka kerja akan memanggilnya secara otomatis untuk mengurai nilai string.
public record ProductFilter(string? Category, decimal? MinPrice)
{
public static bool TryParse(string value, out ProductFilter result)
{
var parts = value.Split(':');
result = new ProductFilter(
parts.Length > 0 ? parts[0] : null,
parts.Length > 1 && decimal.TryParse(parts[1], out var p) ? p : null);
return true;
}
}
// Usage: GET /products?filter=Electronics:50
app.MapGet("/products", ([FromQuery] ProductFilter filter) => filter);Validasi Anotasi Data
Hiasi DTO permintaan Anda dengan atribut anotasi data. Dalam API Minimal, gunakan antarmuka IValidatableObject atau penyaring validasi untuk memicu validasi.
using System.ComponentModel.DataAnnotations;
record CreateProductRequest
{
[Required, MaxLength(200)]
public string Name { get; init; } = "";
[Range(0.01, 999999)]
public decimal Price { get; init; }
[Range(0, int.MaxValue)]
public int Stock { get; init; }
}Penyaring Titik Akhir untuk Validasi
Penyaring titik akhir berjalan sebelum atau sesudah penangan. Gunakan penyaring ini untuk menambahkan validasi model—menolak permintaan yang tidak valid sebelum mencapai logika bisnis Anda.
app.MapPost("/products", CreateProduct)
.AddEndpointFilter(async (ctx, next) =>
{
var req = ctx.GetArgument<CreateProductRequest>(0);
var errors = new List<ValidationResult>();
if (!Validator.TryValidateObject(req,
new ValidationContext(req), errors, true))
{
return Results.ValidationProblem(
errors.ToDictionary(e => e.MemberNames.First(),
e => new[] { e.ErrorMessage! }));
}
return await next(ctx);
});Integrasi FluentValidation
Untuk aturan validasi yang kompleks, gunakan FluentValidation bersama paket SharpGrip.FluentValidation.AutoValidation.Endpoints untuk validasi otomatis dalam API Minimal.
public class CreateProductValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductValidator()
{
RuleFor(x => x.Name).NotEmpty().MaximumLength(200);
RuleFor(x => x.Price).GreaterThan(0);
RuleFor(x => x.Stock).GreaterThanOrEqualTo(0);
}
}
builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<CreateProductValidator>();Grup Rute Bertingkat
Grup rute dapat dibuat bertingkat untuk memodelkan sumber daya hierarkis, seperti pesanan yang berisi item baris.
var api = app.MapGroup("/api").RequireAuthorization();
var orders = api.MapGroup("/orders");
orders.MapGet("/", GetAllOrders);
orders.MapGet("/{id:int}", GetOrder);
// Nested: /api/orders/{orderId}/lines
var lines = orders.MapGroup("/{orderId:int}/lines");
lines.MapGet("/", GetOrderLines);
lines.MapPost("/", AddOrderLine);
lines.MapDelete("/{id}", RemoveOrderLine);Contoh Dunia Nyata: Grup API Berversi
Kelompokkan titik akhir berdasarkan versi API untuk mendukung pembuatan versi berdampingan tanpa menggandakan konfigurasi autentikasi atau label.
var v1 = app.MapGroup("/api/v1")
.RequireAuthorization()
.WithTags("v1");
var v2 = app.MapGroup("/api/v2")
.RequireAuthorization()
.WithTags("v2");
v1.MapGet("/products", GetProductsV1);
v2.MapGet("/products", GetProductsV2); // richer responsePemeriksaan Singkat
Apa tujuan MapGroup() dalam API Minimal?
Ringkasan: Grup Rute, Parameter & Validasi
Hal-hal penting:
MapGroup(): membagikan awalan dan konfigurasi ke beberapa titik akhir- Batasan rute (
:int,:guid,:min) otomatis menolak rute yang tidak cocok [FromQuery],[FromHeader],[FromBody]untuk menentukan sumber pengikatan secara eksplisit- Implementasikan
TryParsepada tipe khusus untuk pengikatan rute/kueri otomatis - Penyaring titik akhir memungkinkan kebutuhan lintas komponen seperti validasi
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Grup Rute, Parameter & Validasi” gratis?
Ya — teks lengkap “Grup Rute, Parameter & Validasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Grup Rute, Parameter & Validasi”?
Atur endpoint dengan MapGroup, ikat parameter rute/kueri/body, dan lakukan validasi dengan anotasi data. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Grup Rute, Parameter & Validasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat Minimal API Pertama Anda
- Grup Rute, Parameter & Validasi
- Middleware & Filter dalam Minimal API
- OpenAPI, Pemberian Versi & Deployment