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.