02-controller-rest-api

知识库
知识库文档
/tech-stacks/csharp/examples/02-controller-rest-api.md

文档

C# ASP.NET Core — Controller RESTful API

目标

使用 Controller 模式构建完整的用户管理 RESTful API,模拟数据库 CRUD 操作。

完整代码

// Models/User.cs
public record User(int Id, string Name, string Email);

// Models/CreateUserRequest.cs
public record CreateUserRequest(string Name, string Email);

// Models/UpdateUserRequest.cs
public record UpdateUserRequest(string? Name, string? Email);

// Controllers/UsersController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private static readonly List<User> _users = new()
    {
        new(1, "Alice", "alice@example.com"),
        new(2, "Bob", "bob@example.com"),
    };
    private static int _nextId = 3;

    // GET /api/users
    [HttpGet]
    public IActionResult GetAll() =>
        Ok(new { total = _users.Count, data = _users });

    // GET /api/users/{id}
    [HttpGet("{id:int}")]
    public IActionResult GetById(int id)
    {
        var user = _users.FirstOrDefault(u => u.Id == id);
        return user is null ? NotFound(new { error = "User not found" }) : Ok(user);
    }

    // POST /api/users
    [HttpPost]
    public IActionResult Create([FromBody] CreateUserRequest request)
    {
        if (string.IsNullOrWhiteSpace(request.Name) ||
            string.IsNullOrWhiteSpace(request.Email))
            return BadRequest(new { error = "name and email are required" });

        var user = new User(_nextId++, request.Name, request.Email);
        _users.Add(user);
        return CreatedAtAction(nameof(GetById), new { id = user.Id }, user);
    }

    // PUT /api/users/{id}
    [HttpPut("{id:int}")]
    public IActionResult Update(int id, [FromBody] UpdateUserRequest request)
    {
        var user = _users.FirstOrDefault(u => u.Id == id);
        if (user is null) return NotFound(new { error = "User not found" });

        var updated = user with
        {
            Name = request.Name ?? user.Name,
            Email = request.Email ?? user.Email
        };
        _users[_users.IndexOf(user)] = updated;
        return Ok(updated);
    }

    // DELETE /api/users/{id}
    [HttpDelete("{id:int}")]
    public IActionResult Delete(int id)
    {
        var user = _users.FirstOrDefault(u => u.Id == id);
        if (user is null) return NotFound(new { error = "User not found" });
        _users.Remove(user);
        return NoContent();
    }
}

Program.cs(注册控制器)

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // 注册控制器
var app = builder.Build();
app.MapControllers();              // 映射控制器路由
app.Run();

测试

curl http://localhost:5000/api/users
curl -X POST http://localhost:5000/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Charlie","email":"charlie@example.com"}'
curl -X PUT http://localhost:5000/api/users/1 \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice Updated"}'
curl -X DELETE http://localhost:5000/api/users/3

要点说明

  • [ApiController] 自动模型验证、400 响应、路由推断
  • record 类型提供值相等、with 表达式、不可变性
  • [FromBody] 从 JSON 请求体绑定参数
  • CreatedAtAction 返回 201 + Location 头
  • NoContent() 返回 204(删除成功标准)

信息

路径
/tech-stacks/csharp/examples/02-controller-rest-api.md
更新时间
2026/5/30