0Pricing
C# Academy · Leçon

Groupes de routes, paramètres et validation

Organisez les points de terminaison avec MapGroup, liez les paramètres de route, de requête et de corps, puis validez-les avec les annotations de données.

Groupes de routes, paramètres et validation est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Groupes de routes pour l’organisation

MapGroup() (introduit dans .NET 7) vous permet de regrouper des points de terminaison associés sous un préfixe commun et d’appliquer une configuration partagée — intergiciel, politiques d’authentification, étiquettes — sans la répéter pour chaque point de terminaison.

Créer un groupe de routes

Appelez app.MapGroup("/api/products"), puis mappez les points de terminaison sur le groupe renvoyé. Le préfixe est automatiquement ajouté au début de toutes les routes.

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}

Appliquer l’authentification à un groupe

Utilisez RequireAuthorization() sur le groupe pour protéger tous les points de terminaison en une seule fois. Les points de terminaison individuels peuvent toujours remplacer ce comportement avec 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();

Contraintes des paramètres de route

Imposez des contraintes aux paramètres de route à l’aide de motifs de type. Le routeur rejette les requêtes qui ne correspondent pas et renvoie automatiquement une réponse 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);

Liaison depuis différentes sources

Les paramètres sont liés depuis différentes sources à l’aide d’attributs. Par défaut, les types simples proviennent de la route ou de la requête, et les types complexes du corps.

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

Liaison personnalisée des paramètres avec TryParse

Pour les types personnalisés utilisés comme paramètres de route ou de requête, implémentez une méthode statique TryParse. Le framework l’appelle automatiquement pour analyser la valeur chaîne.

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

Validation avec les annotations de données

Décorez vos DTO de requête avec des attributs d’annotation de données. Dans les API minimales, utilisez l’interface IValidatableObject ou un filtre de validation pour déclencher la validation.

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

Filtres de points de terminaison pour la validation

Les filtres de points de terminaison s’exécutent avant ou après le gestionnaire. Utilisez-les pour ajouter la validation du modèle et rejeter les requêtes non valides avant qu’elles n’atteignent votre logique métier.

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

Intégration de FluentValidation

Pour les règles de validation complexes, utilisez FluentValidation avec le paquet SharpGrip.FluentValidation.AutoValidation.Endpoints afin d’assurer une validation automatique dans les API minimales.

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

Groupes de routes imbriqués

Les groupes de routes peuvent être imbriqués pour représenter des ressources hiérarchiques, comme des commandes contenant des lignes de commande.

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

Cas réel&nbsp;: groupe d’API versionné

Regroupez les points de terminaison par version d’API pour prendre en charge le versionnement côte à côte sans dupliquer la configuration de l’authentification ou des étiquettes.

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

Vérification rapide

Quel est le rôle de MapGroup() dans les API minimales ?

Récapitulatif&nbsp;: groupes de routes, paramètres et validation

Points clés :

  • MapGroup() : partagez le préfixe et la configuration entre plusieurs points de terminaison
  • Les contraintes de route (:int, :guid, :min) rejettent automatiquement les routes qui ne correspondent pas
  • [FromQuery], [FromHeader], [FromBody] pour définir explicitement la source de liaison
  • Implémentez TryParse sur les types personnalisés pour assurer la liaison automatique depuis la route ou la requête
  • Les filtres de points de terminaison permettent de gérer des préoccupations transversales comme la validation

Questions Fréquemment Posées

La leçon « Groupes de routes, paramètres et validation » est-elle gratuite ?

Oui — le texte complet de « Groupes de routes, paramètres et validation » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Groupes de routes, paramètres et validation » ?

Organisez les points de terminaison avec MapGroup, liez les paramètres de route, de requête et de corps, puis validez-les avec les annotations de données. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Groupes de routes, paramètres et validation » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Créer votre première API Minimal
  2. Groupes de routes, paramètres et validation
  3. Intergiciels et filtres dans les API Minimal
  4. OpenAPI, versionnement et déploiement
← Retour à C# Academy