0Pricing
C# Academy · Pelajaran

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 response

Pemeriksaan 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 TryParse pada 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

  1. Membuat Minimal API Pertama Anda
  2. Grup Rute, Parameter & Validasi
  3. Middleware & Filter dalam Minimal API
  4. OpenAPI, Pemberian Versi & Deployment
← Kembali ke C# Academy