0Pricing
C# Academy · บทเรียน

กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ

จัดระเบียบจุดปลายทางด้วย MapGroup ผูกพารามิเตอร์ของเส้นทาง คำสืบค้น และเนื้อหา พร้อมตรวจสอบด้วยคำอธิบายข้อมูล

กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

กลุ่มเส้นทางเพื่อการจัดระเบียบ

MapGroup() (เริ่มใช้ใน .NET 7) ช่วยให้คุณจัดกลุ่มจุดปลายทางที่เกี่ยวข้องไว้ภายใต้คำนำหน้าร่วมกัน และใช้การกำหนดค่าร่วมกัน เช่น มิดเดิลแวร์ นโยบายการยืนยันตัวตน และแท็ก โดยไม่ต้องทำซ้ำในแต่ละจุดปลายทาง

การสร้างกลุ่มเส้นทาง

เรียกใช้ app.MapGroup("/api/products") แล้วแมปจุดปลายทางบนกลุ่มที่ส่งคืนมา ระบบจะเติมคำนำหน้าไว้หน้าทุกเส้นทางโดยอัตโนมัติ

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}

การใช้การยืนยันตัวตนกับกลุ่ม

ใช้ RequireAuthorization() กับกลุ่มเพื่อป้องกันจุดปลายทางทั้งหมดพร้อมกัน จุดปลายทางแต่ละรายการยังสามารถกำหนดเป็นข้อยกเว้นด้วย 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();

ข้อจำกัดพารามิเตอร์เส้นทาง

กำหนดข้อจำกัดพารามิเตอร์เส้นทางด้วยรูปแบบชนิดข้อมูล เราเตอร์จะปฏิเสธคำขอที่ไม่ตรงรูปแบบและส่งคืน 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);

การผูกค่าจากแหล่งต่าง ๆ

พารามิเตอร์จะถูกผูกค่าจากแหล่งต่าง ๆ โดยใช้แอตทริบิวต์ ตามค่าเริ่มต้น ชนิดข้อมูลพื้นฐานจะมาจากเส้นทางหรือคำค้น ส่วนชนิดข้อมูลซับซ้อนจะมาจากเนื้อความคำขอ

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

การผูกพารามิเตอร์แบบกำหนดเองด้วย TryParse

สำหรับชนิดข้อมูลแบบกำหนดเองที่ใช้เป็นพารามิเตอร์เส้นทางหรือคำค้น ให้สร้างเมธอดแบบสแตติกชื่อ TryParse เฟรมเวิร์กจะเรียกใช้เมธอดนี้โดยอัตโนมัติเพื่อแยกวิเคราะห์ค่าข้อความ

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

การตรวจสอบความถูกต้องด้วยคำอธิบายข้อมูล

ตกแต่ง DTO ของคำขอด้วยแอตทริบิวต์คำอธิบายข้อมูล ใน API แบบมินิมอล ให้ใช้อินเทอร์เฟซ IValidatableObject หรือตัวกรองการตรวจสอบความถูกต้องเพื่อเรียกใช้การตรวจสอบ

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

ตัวกรองจุดปลายทางสำหรับการตรวจสอบความถูกต้อง

ตัวกรองจุดปลายทางจะทำงานก่อนหรือหลังตัวจัดการ ใช้ตัวกรองเหล่านี้เพื่อเพิ่มการตรวจสอบโมเดล โดยปฏิเสธคำขอที่ไม่ถูกต้องก่อนส่งต่อไปยังตรรกะทางธุรกิจ

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

การผสานรวม FluentValidation

สำหรับกฎการตรวจสอบที่ซับซ้อน ให้ใช้ FluentValidation ร่วมกับแพ็กเกจ SharpGrip.FluentValidation.AutoValidation.Endpoints เพื่อให้ API แบบมินิมอลตรวจสอบความถูกต้องโดยอัตโนมัติ

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

กลุ่มเส้นทางแบบซ้อน

กลุ่มเส้นทางสามารถซ้อนกันเพื่อจำลองทรัพยากรแบบลำดับชั้น เช่น คำสั่งซื้อที่มีรายการสินค้า

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

ตัวอย่างจากโลกจริง: กลุ่ม API ที่มีเวอร์ชัน

จัดกลุ่มจุดปลายทางตามเวอร์ชัน API เพื่อรองรับการใช้หลายเวอร์ชันควบคู่กัน โดยไม่ต้องทำซ้ำการกำหนดค่าการยืนยันตัวตนหรือแท็ก

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

ตรวจสอบความเข้าใจ

MapGroup() มีจุดประสงค์ใดใน API แบบมินิมอล

สรุป: กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบความถูกต้อง

ประเด็นสำคัญ:

  • MapGroup(): ใช้คำนำหน้าและการกำหนดค่าร่วมกันกับจุดปลายทางหลายรายการ
  • ข้อจำกัดเส้นทาง (:int, :guid, :min) จะปฏิเสธเส้นทางที่ไม่ตรงโดยอัตโนมัติ
  • [FromQuery], [FromHeader], [FromBody] ใช้ระบุแหล่งที่มาของการผูกค่าอย่างชัดเจน
  • สร้าง TryParse ในชนิดข้อมูลแบบกำหนดเองเพื่อให้ผูกค่าจากเส้นทางหรือคำค้นโดยอัตโนมัติ
  • ตัวกรองจุดปลายทางช่วยรองรับข้อกังวลร่วม เช่น การตรวจสอบความถูกต้อง

คำถามที่พบบ่อย

บทเรียน “กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ”

จัดระเบียบจุดปลายทางด้วย MapGroup ผูกพารามิเตอร์ของเส้นทาง คำสืบค้น และเนื้อหา พร้อมตรวจสอบด้วยคำอธิบายข้อมูล คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้าง Minimal API แรกของคุณ
  2. กลุ่มเส้นทาง พารามิเตอร์ และการตรวจสอบ
  3. มิดเดิลแวร์และตัวกรองใน Minimal APIs
  4. OpenAPI การกำหนดเวอร์ชัน และการนำไปใช้งาน
← กลับไปที่ C# Academy