0Pricing
C# Academy · Lekcja

Grupy tras, parametry i walidacja

Porządkuj endpointy za pomocą MapGroup, wiąż parametry tras, zapytań i treści żądania oraz przeprowadzaj walidację za pomocą adnotacji danych.

Grupy tras, parametry i walidacja to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Grupy tras do organizacji

MapGroup() (wprowadzone w .NET 7) pozwala grupować powiązane endpointy ze wspólnym prefiksem i stosować wspólną konfigurację — middleware, zasady autoryzacji i tagi — bez powtarzania jej dla każdego endpointu.

Tworzenie grupy tras

Należy wywołać app.MapGroup("/api/products"), a następnie mapować endpointy na zwróconej grupie. Prefiks jest automatycznie dodawany przed wszystkimi trasami.

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}

Stosowanie autoryzacji w grupie

Należy użyć RequireAuthorization() na grupie, aby jednocześnie zabezpieczyć wszystkie endpointy. Poszczególne endpointy mogą nadal zmienić to ustawienie za pomocą 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();

Ograniczenia parametrów trasy

Parametry trasy należy ograniczać za pomocą wzorców typów. Router odrzuca żądania, które nie pasują do wzorca, i automatycznie zwraca kod 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);

Wiązanie z różnych źródeł

Parametry są wiązane z różnych źródeł za pomocą atrybutów. Domyślnie typy proste pochodzą z trasy lub zapytania, a typy złożone z treści żądania.

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();
});

Niestandardowe wiązanie parametrów za pomocą TryParse

W przypadku własnych typów używanych jako parametry trasy lub zapytania należy zaimplementować statyczną metodę TryParse. Framework automatycznie wywołuje ją w celu sparsowania wartości tekstowej.

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);

Walidacja za pomocą adnotacji danych

Obiekty DTO żądań należy opatrzyć atrybutami adnotacji danych. W Minimal APIs należy użyć interfejsu IValidatableObject albo filtra walidacji, aby uruchomić walidację.

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; }
}

Filtry endpointów do walidacji

Filtry endpointów są wykonywane przed handlerem lub po nim. Należy ich używać do dodawania walidacji modelu — odrzucania nieprawidłowych żądań, zanim dotrą do logiki biznesowej.

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);
   });

Integracja z FluentValidation

W przypadku złożonych reguł walidacji należy użyć FluentValidation wraz z pakietem SharpGrip.FluentValidation.AutoValidation.Endpoints, aby automatycznie przeprowadzać walidację w Minimal APIs.

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>();

Zagnieżdżone grupy tras

Grupy tras można zagnieżdżać, aby modelować hierarchiczne zasoby, takie jak zamówienia zawierające pozycje.

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);

Praktyczny przykład: wersjonowana grupa API

Grupowanie endpointów według wersji API umożliwia obsługę równoległych wersji bez powielania konfiguracji autoryzacji ani tagów.

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

Szybkie sprawdzenie

Do czego służy MapGroup() w Minimal APIs?

Podsumowanie: grupy tras, parametry i walidacja

Najważniejsze informacje:

  • MapGroup(): wspólny prefiks i konfiguracja dla wielu endpointów
  • Ograniczenia tras (:int, :guid, :min) automatycznie odrzucają niepasujące trasy
  • [FromQuery], [FromHeader], [FromBody] służą do jawnego wskazywania źródła wiązania
  • Własnym typom należy zaimplementować TryParse, aby umożliwić automatyczne wiązanie z trasy lub zapytania
  • Filtry endpointów umożliwiają obsługę kwestii przekrojowych, takich jak walidacja

Często zadawane pytania

Czy lekcja „Grupy tras, parametry i walidacja” jest bezpłatna?

Tak — pełny tekst „Grupy tras, parametry i walidacja” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Grupy tras, parametry i walidacja”?

Porządkuj endpointy za pomocą MapGroup, wiąż parametry tras, zapytań i treści żądania oraz przeprowadzaj walidację za pomocą adnotacji danych. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Grupy tras, parametry i walidacja”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie pierwszego Minimal API
  2. Grupy tras, parametry i walidacja
  3. Middleware i filtry w Minimal APIs
  4. OpenAPI, wersjonowanie i wdrażanie
← Powrót do C# Academy