.NET Web API、路由、模型验证、过滤器、全局异常
<div dir="ltr"><h2>一、.NET Web API 是什么</h2>
<div> </div>
<div>ASP.NET Web API 是微软用于构建 HTTP 服务 的框架,专门用来开发:</div>
<div> </div>
<ul>
<li>前后端分离接口</li>
<li>移动端 API</li>
<li>微服务接口</li>
</ul>
<div> </div>
<div>它基于 Controller + Action 模式,返回 JSON/XML 数据,不返回页面。</div>
<div> </div>
<hr>
<div> </div>
<h2>二、路由(Routing)</h2>
<div> </div>
<div>路由的作用:把 URL 映射到控制器的方法</div>
<div> </div>
<h3>1. 两种路由方式</h3>
<div> </div>
<h4>(1)特性路由</h4>
<div> </div>
<div>直接在控制器 / 方法上写 <code></code> 定义 URL</div>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>")]
public class UserController : ControllerBase
{
// GET api/user
public IActionResult GetAll() { ... }
// GET api/user/10
public IActionResult GetById(int id) { ... }
// POST api/user
public IActionResult Add( User user) { ... }
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<h4>(2)传统路由(少用)</h4>
<div> </div>
<div>在 <code>Program.cs</code> 统一配置</div>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>app.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action}/{id?}");
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>2. 路由常用特性</h3>
<div> </div>
<ul>
<li><code></code> / <code></code> / <code></code> / <code></code></li>
<li><code></code> 自定义路由</li>
<li><code></code> 从请求体取数据</li>
<li><code></code> 从 URL 参数取数据</li>
<li><code></code> 从路由取数据</li>
</ul>
<div> </div>
<hr>
<div> </div>
<h2>三、模型验证(Model Validation)</h2>
<div> </div>
<div>模型验证 = 自动校验前端传入的参数是否合法</div>
<div> </div>
<h3>1. 给模型加数据注解</h3>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>2. 常用验证特性</h3>
<div> </div>
<ul>
<li><code></code> 必填</li>
<li><code></code> 字符串长度</li>
<li><code></code> 数值范围</li>
<li><code></code> 邮箱</li>
<li><code></code> 手机号</li>
<li><code></code> 正则</li>
</ul>
<div> </div>
<h3>3. API 中自动验证</h3>
<div> </div>
<div><code></code> 特性会自动触发模型验证,验证失败自动返回 400,无需手动判断。</div>
<div> </div>
<div>返回格式示例:</div>
<div> </div>
<div>
<div dir="ltr">
<div>
<div>json</div>
<div> </div>
</div>
<div>
<pre><code>{
"errors": {
"Name": ["姓名不能为空"],
"Age": ["年龄必须在18-60之间"]
},
"title": "One or more validation errors occurred.",
"status": 400
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<hr>
<div> </div>
<h2>四、过滤器(Filters)</h2>
<div> </div>
<div>过滤器 = 在 Action 执行前后插入逻辑,实现横切关注点(日志、授权、缓存等)</div>
<div> </div>
<h3>1. 5 种过滤器</h3>
<div> </div>
<ol>
<li>Authorization Filter 授权过滤器(最先执行)</li>
<li>Resource Filter 资源过滤器</li>
<li>Action Filter 方法过滤器(最常用)</li>
<li>Exception Filter 异常过滤器</li>
<li>Result Filter 结果过滤器</li>
</ol>
<div> </div>
<h3>2. 自定义 Action 过滤器(示例)</h3>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>public class LogFilter : IActionFilter
{
// 方法执行前
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("API 调用前:" + context.HttpContext.Request.Path);
}
// 方法执行后
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("API 调用完成");
}
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>3. 注册使用</h3>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>// 全局注册(所有接口生效)
builder.Services.AddControllers(options =>
{
options.Filters.Add<LogFilter>();
});
// 或控制器/方法单独使用
public IActionResult Test() { ... }
</code></pre>
</div>
<div> </div>
</div>
</div>
<hr>
<div> </div>
<h2>五、全局异常处理(Global Exception)</h2>
<div> </div>
<div>作用:统一捕获所有接口的异常,返回规范错误信息,不暴露敏感堆栈</div>
<div> </div>
<h3>1. 自定义全局异常过滤器</h3>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>public class GlobalExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
var exception = context.Exception;
// 统一返回格式
var result = new
{
code = 500,
message = "服务器异常:" + exception.Message,
path = context.HttpContext.Request.Path
};
context.Result = new JsonResult(result)
{
StatusCode = 500
};
// 标记异常已处理
context.ExceptionHandled = true;
}
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>2. 注册全局生效</h3>
<div> </div>
<div>
<div dir="ltr">
<div>
<pre><code>builder.Services.AddControllers(options =>
{
options.Filters.Add<GlobalExceptionFilter>();
});
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>3. 效果</h3>
<div> </div>
<div>任何接口报错都会返回:</div>
<div> </div>
<div>
<div dir="ltr">
<div>
<div>json</div>
<div> </div>
</div>
<div>
<pre><code>{
"code": 500,
"message": "服务器异常:尝试除以零",
"path": "/api/user"
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<hr>
<div> </div>
<h1>总结</h1>
<div> </div>
<ol>
<li>Web API:构建 HTTP 接口,返回数据</li>
<li>路由:URL 映射到方法,特性路由最常用</li>
<li>模型验证:自动校验参数,<code></code> 自动处理</li>
<li>过滤器:在接口执行前后插入逻辑(日志、授权)</li>
<li>全局异常:统一捕获错误,返回规范错误信息</li>
</ol></div><br><br>
来源:https://www.cnblogs.com/chuansheng/p/19913479
頁:
[1]