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

การสร้าง Minimal API แรกของคุณ

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

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

API แบบเรียบง่ายคืออะไร

API แบบเรียบง่ายซึ่งเปิดตัวใน .NET 6 ช่วยให้คุณสร้างปลายทาง HTTP ได้โดยมีโค้ดประกอบน้อยที่สุด ไม่ต้องใช้ตัวควบคุมหรือแอตทริบิวต์การทำงาน เพียงกำหนดตัวจัดการเส้นทางไว้โดยตรงใน Program.cs จึงเหมาะอย่างยิ่งสำหรับไมโครเซอร์วิสและ API น้ำหนักเบา

API แบบเรียบง่ายที่พื้นฐานที่สุด

API HTTP ที่สมบูรณ์ได้ด้วยโค้ดเพียงไม่กี่บรรทัด เมธอด MapGet, MapPost, MapPut และ MapDelete จะกำหนดตัวจัดการเส้นทางสำหรับแต่ละคำกริยา HTTP

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello, Minimal API!");
app.MapGet("/ping", () => Results.Ok(new { status = "pong" }));

app.Run();
// That's it — no Startup.cs, no controllers

ผลลัพธ์แบบระบุชนิดสำหรับการตอบกลับ HTTP ที่ถูกต้อง

ใช้ Results หรือ TypedResults เพื่อกำหนดรหัสสถานะ HTTP และชนิดเนื้อหาให้ถูกต้อง โดยแนะนำให้ใช้ TypedResults เพื่อให้อนุมานโครงร่าง OpenAPI ได้

app.MapGet("/products/{id}", async (int id, AppDbContext db) =>
{
    var product = await db.Products.FindAsync(id);
    return product is null
        ? Results.NotFound()
        : Results.Ok(product);
});

app.MapPost("/products", async (Product product, AppDbContext db) =>
{
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Results.Created($"/products/{product.Id}", product);
});

พารามิเตอร์เส้นทางและสตริงคิวรี

พารามิเตอร์เส้นทางจะถูกดึงจากพาธของ URL พารามิเตอร์สตริงคิวรีจะถูกผูกจากคิวรีโดยอัตโนมัติ และเนื้อหาคำขอจะถูกดีซีเรียลไลซ์จาก JSON

// Route param {id} + query param ?includeDeleted
app.MapGet("/orders/{id}", async (
    int id,
    bool includeDeleted = false,
    AppDbContext db) =>
{
    var query = db.Orders.AsQueryable();
    if (!includeDeleted) query = query.Where(o => !o.IsDeleted);
    var order = await query.FirstOrDefaultAsync(o => o.Id == id);
    return order is null ? Results.NotFound() : Results.Ok(order);
});

การแทรกการพึ่งพาในตัวจัดการเส้นทาง

บริการที่ลงทะเบียนไว้ในคอนเทนเนอร์ DI สามารถแทรกเข้าไปเป็นพารามิเตอร์ของตัวจัดการเส้นทางได้โดยตรง เฟรมเวิร์กจะค้นหาและจัดเตรียมบริการเหล่านั้นโดยอัตโนมัติ

builder.Services.AddScoped<ProductService>();

app.MapGet("/products", async (ProductService svc) =>
{
    var products = await svc.GetAllAsync();
    return Results.Ok(products);
});

app.MapDelete("/products/{id}", async (int id, ProductService svc) =>
{
    var deleted = await svc.DeleteAsync(id);
    return deleted ? Results.NoContent() : Results.NotFound();
});

การผูกข้อมูลจากเนื้อหาคำขอ

พารามิเตอร์ที่ตรงกับบริการที่ลงทะเบียนไว้จะถูกแทรกให้โดยอัตโนมัติ ส่วนพารามิเตอร์อื่น ๆ จะถูกผูกจากเนื้อหาคำขอ (โดยค่าเริ่มต้นคือ JSON) หากจำเป็น ให้ใช้ [FromBody] อย่างชัดเจน

record CreateProductRequest(string Name, decimal Price, int Stock);

app.MapPost("/products", async (
    CreateProductRequest req,
    ProductService svc) =>
{
    var product = await svc.CreateAsync(req.Name, req.Price, req.Stock);
    return TypedResults.Created($"/products/{product.Id}", product);
});

การส่งคืนรหัสสถานะที่แตกต่างกัน

Results มีเมธอดสร้างผลลัพธ์สำหรับการตอบกลับ HTTP ทั่วไปทั้งหมด ควรใช้เมธอดเหล่านี้เพื่อสร้าง REST API ที่สื่อความหมายได้ถูกต้อง

app.MapPut("/products/{id}", async (int id, Product update, AppDbContext db) =>
{
    var existing = await db.Products.FindAsync(id);
    if (existing is null) return Results.NotFound();

    existing.Name  = update.Name;
    existing.Price = update.Price;
    await db.SaveChangesAsync();
    return Results.Ok(existing);
});

// Other useful Results:
// Results.BadRequest("message")
// Results.Conflict()
// Results.UnprocessableEntity(errors)
// Results.Accepted()

การเพิ่มข้อมูลกำกับด้วย WithName และ WithTags

แนบข้อมูลกำกับเข้ากับปลายทางเพื่อปรับปรุงเอกสารและการกำหนดเส้นทาง ใช้ WithName, WithTags และ WithSummary เพื่อจัดระเบียบผลลัพธ์ OpenAPI

app.MapGet("/products/{id}", GetProduct)
   .WithName("GetProductById")
   .WithTags("Products")
   .WithSummary("Retrieves a product by its ID")
   .Produces<Product>()
   .Produces(404);

static async Task<IResult> GetProduct(int id, AppDbContext db)
{
    var p = await db.Products.FindAsync(id);
    return p is null ? Results.NotFound() : Results.Ok(p);
}

การกำหนดสิทธิ์ใน API แบบเรียบง่าย

ใช้ RequireAuthorization() เพื่อปกป้องปลายทาง หรือใช้ AllowAnonymous() เพื่อยกเว้นการป้องกัน นโยบายทำงานเช่นเดียวกับในตัวควบคุม

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();

app.UseAuthentication();
app.UseAuthorization();

app.MapGet("/profile", (ClaimsPrincipal user) =>
    Results.Ok(user.Identity!.Name))
   .RequireAuthorization();

app.MapGet("/public", () => "No auth needed")
   .AllowAnonymous();

การจัดระเบียบด้วยเมธอดแบบสแตติก

สำหรับ API ขนาดใหญ่ ควรย้ายตัวจัดการเส้นทางไปไว้ในเมธอดแบบสแตติกหรือเมธอดส่วนขยาย เพื่อให้ Program.cs สะอาดและนำทางได้ง่าย

// Extension method groups endpoints by feature
public static class ProductEndpoints
{
    public static void MapProductEndpoints(this WebApplication app)
    {
        app.MapGet("/products",    GetAll);
        app.MapGet("/products/{id}", GetById);
        app.MapPost("/products",   Create);
    }

    private static async Task<IResult> GetAll(AppDbContext db)
        => Results.Ok(await db.Products.AsNoTracking().ToListAsync());

    // ... other handlers
}

// In Program.cs:
app.MapProductEndpoints();

ตัวอย่างจากโลกจริง: API แบบมินิมอลสำหรับการดำเนินการครบชุด

API แบบมินิมอลที่สมบูรณ์สำหรับทรัพยากร Todo — กระชับ ทดสอบได้ และพร้อมใช้งานจริง

app.MapGet("/todos", async (AppDbContext db) =>
    Results.Ok(await db.Todos.AsNoTracking().ToListAsync()));

app.MapGet("/todos/{id}", async (int id, AppDbContext db) =>
{
    var todo = await db.Todos.FindAsync(id);
    return todo is null ? Results.NotFound() : Results.Ok(todo);
});

app.MapPost("/todos", async (Todo todo, AppDbContext db) =>
{
    db.Todos.Add(todo);
    await db.SaveChangesAsync();
    return Results.Created($"/todos/{todo.Id}", todo);
});

app.MapDelete("/todos/{id}", async (int id, AppDbContext db) =>
{
    int n = await db.Todos.Where(t => t.Id == id).ExecuteDeleteAsync();
    return n > 0 ? Results.NoContent() : Results.NotFound();
});

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

ตัวจัดการเส้นทางของ API แบบมินิมอลรับบริการ DI ที่ลงทะเบียนไว้อย่างไร

สรุป: การสร้าง API แบบมินิมอลแรกของคุณ

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

  • MapGet/Post/Put/Delete กำหนดตัวจัดการเส้นทางโดยตรงใน Program.cs
  • ใช้ Results / TypedResults เพื่อกำหนดรหัสสถานะ HTTP ที่ถูกต้อง
  • พารามิเตอร์เส้นทาง พารามิเตอร์คำค้น เนื้อความคำขอ และ DI จะถูกผูกค่าโดยอัตโนมัติ
  • ใช้ RequireAuthorization() และ AllowAnonymous() สำหรับการยืนยันตัวตน
  • จัดระเบียบ API ขนาดใหญ่ด้วยเมธอดส่วนขยายหรือกลุ่มเส้นทาง

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

บทเรียน “การสร้าง Minimal API แรกของคุณ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้าง Minimal API แรกของคุณ”

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

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

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

บทเรียน “การสร้าง Minimal API แรกของคุณ” ใช้เวลานานแค่ไหน

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

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

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

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

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