Roadmap › ASP.NET Core Web API & REST › Module: REST Fundamentals
Lessons in this course (15)

3. Controller-based API

Basic★ Must knowLesson 3 of 15
csharp
[ApiController]
[Route("api/[controller]")]
public class OrdersController(IOrderService orders) : ControllerBase
{
    [HttpGet]
    public async Task<ActionResult<PagedResult<OrderDto>>> List([FromQuery] OrderQuery q, CancellationToken ct) =>
        Ok(await orders.ListAsync(q, ct));

    [HttpGet("{id:int}")]
    [ProducesResponseType<OrderDto>(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public async Task<ActionResult<OrderDto>> Get(int id, CancellationToken ct) =>
        await orders.GetAsync(id, ct) is { } dto ? dto : NotFound();

    [HttpPost]
    public async Task<ActionResult<OrderDto>> Create(CreateOrderRequest req, CancellationToken ct)
    {
        var dto = await orders.CreateAsync(req, ct);
        return CreatedAtAction(nameof(Get), new { id = dto.Id }, dto);   // 201 + Location
    }

    [HttpDelete("{id:int}")]
    public async Task<IActionResult> Delete(int id, CancellationToken ct) =>
        await orders.DeleteAsync(id, ct) ? NoContent() : NotFound();
}

[ApiController] gives: attribute routing required, automatic 400 ValidationProblemDetails when ModelState is invalid, binding-source inference (complex types from body, simple from route/query), ProblemDetails for error status codes.