当前位置: 首页 > news >正文

ASP.NET Core Web API 中 HTTP状态码的分类及对应的返回方法

文章目录

  • 前言
  • 一、HTTP状态码分类及常用方法
  • 二、具体返回方法示例
  • 1) 2xx 成功类
    • 2)4xx 客户端错误
    • 3)5xx 服务器错误
    • 4)其他特殊状态码
  • 三、高级返回方式
    • 1)使用 IActionResult 与 ActionResult<T>
    • 2)统一错误处理(Problem Details)
    • 3)自定义状态码结果
  • 四、最佳实践建议
    • 优先使用内置方法
    • POST创建资源时返回201
    • 模型验证统一处理
    • 异步方法一致处理
    • 生产环境隐藏敏感错误
  • 总结


前言

在ASP.NET Core Web API中,HTTP状态码用于表示请求的处理结果。

一、HTTP状态码分类及常用方法

类别常见状态码内置辅助方法使用场景
信息响应100StatusCode(100)协议切换请求
成功响应200Ok() / Ok(object)标准GET请求成功
201CreatedAtAction() / CreatedAtRoute资源创建成功(POST)
202Accepted()请求已接受但未完成处理
204NoContent()成功但无返回内容(DELETE常用)
重定向301RedirectPermanent()永久重定向
302Redirect()临时重定向
客户端错误400BadRequest()请求参数无效
401Unauthorized()未授权访问(未登录)
403Forbid()已登录但权限不足
404NotFound()资源不存在
409Conflict()资源冲突(如重复创建)
422UnprocessableEntity()请求语义正确但验证失败(常用于REST API)
服务器错误500StatusCode(500) / Problem()未处理的服务器错误
503StatusCode(503)服务不可用(维护或过载)

二、具体返回方法示例

1) 2xx 成功类

  1. 示例

    // 200 OK(带数据)
    [HttpGet("{id}")]
    public ActionResult<Item> GetItem(int id)
    {
        var item = _repository.GetItem(id);
        return Ok(item); // 自动序列化对象为JSON
    }
    
    // 201 Created(创建资源)
    [HttpPost]
    public IActionResult CreateItem(Item item)
    {
        _repository.Add(item);
        return CreatedAtAction(nameof(GetItem), new { id = item.Id }, item);
    }
    
    // 204 No Content(删除成功)
    [HttpDelete("{id}")]
    public IActionResult DeleteItem(int id)
    {
        _repository.Delete(id);
        return NoContent();
    }
    

2)4xx 客户端错误

  1. 示例

    // 400 Bad Request(手动验证)
    [HttpPost]
    public IActionResult PostItem(Item item)
    {
        if (item.Price <= 0)
        {
            return BadRequest("价格必须大于0");
        }
        return Ok();
    }
    
    // 401 Unauthorized(未授权)
    [HttpGet("secret")]
    public IActionResult GetSecret()
    {
        if (!User.Identity.IsAuthenticated)
        {
            return Unauthorized();
        }
        return Ok("机密数据");
    }
    
    // 422 Unprocessable Entity(验证失败)
    [HttpPost("validate")]
    public IActionResult ValidateItem(Item item)
    {
        if (!ModelState.IsValid)
        {
            return UnprocessableEntity(ModelState); // 返回详细错误
        }
        return Ok();
    }
    

3)5xx 服务器错误

  1. 示例
    // 500 Internal Server Error(自定义错误)
    [HttpGet("error")]
    public IActionResult ThrowError()
    {
        try
        {
            throw new Exception("测试异常");
        }
        catch (Exception ex)
        {
            return Problem(
                title: "服务器错误",
                detail: ex.Message,
                statusCode: 500
            );
        }
    }
    
    // 503 Service Unavailable(服务不可用)
    [HttpGet("maintenance")]
    public IActionResult Maintenance()
    {
        return StatusCode(503, new { Message = "系统维护中,请稍后重试" });
    }
    

4)其他特殊状态码

  1. 示例
    // 418 I'm a teapot(彩蛋状态码)
    [HttpGet("teapot")]
    public IActionResult Teapot() => StatusCode(418);
    
    // 429 Too Many Requests(限流)
    [HttpGet("limited")]
    public IActionResult LimitedRequest()
    {
        Response.Headers.Add("Retry-After", "60"); // 添加响应头
        return StatusCode(429);
    }
    

三、高级返回方式

1)使用 IActionResult 与 ActionResult

  1. 示例
    // 动态返回类型
    [HttpGet("dynamic/{id}")]
    public ActionResult<Item> GetDynamic(int id)
    {
        var item = _repository.GetItem(id);
        return item != null ? item : NotFound();
    }
    

2)统一错误处理(Problem Details)

  1. 示例
    // 返回RFC 7807标准错误格式
    [HttpGet("problem")]
    public IActionResult GetProblem()
    {
        return Problem(
            detail: "余额不足",
            instance: HttpContext.Request.Path,
            statusCode: 400,
            title: "支付失败"
        );
    }
    

3)自定义状态码结果

  1. 示例
    // 继承ActionResult自定义返回
    public class CustomResult : ActionResult
    {
        public override void ExecuteResult(ActionContext context)
        {
            context.HttpContext.Response.StatusCode = 299;
            context.HttpContext.Response.WriteAsync("自定义状态码");
        }
    }
    
    // 使用自定义结果
    [HttpGet("custom")]
    public IActionResult GetCustom() => new CustomResult();
    

四、最佳实践建议

优先使用内置方法

  1. Ok()、NotFound() 等方法更易读且自动处理序列化。

POST创建资源时返回201

  1. 必须包含Location头指向新资源(通过CreatedAtActionCreatedAtRoute)。

模型验证统一处理

  1. 使用 [ApiController] 特性时,无效模型自动返回400错误。

异步方法一致处理

  1. 异步方法返回Task<IActionResult>,用法与同步方法一致。

生产环境隐藏敏感错误

  1. 通过中间件(如UseExceptionHandler)统一处理500错误,避免泄露堆栈信息。

总结

通过适配的方法,可以清晰、规范地在ASP.NET Core Web API中返回各类HTTP状态码,满足RESTful API的设计要求

http://www.dtcms.com/a/112286.html

相关文章:

  • OpenVLA-OFT——微调VLA的三大关键设计:支持动作分块的并行解码、连续动作表示以及L1回归目标
  • 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
  • 使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知
  • 项目实战(16)-GNSS码表
  • springboot集成Kafka
  • 如何在Springboot的Mapper中轻松添加新的SQL语句呀?
  • Eclipse 视图(View)
  • 大模型如何引爆餐饮与电商行业变革
  • 如何在Redis容量限制下保持热点数据
  • Vue3使用富文本编辑器vue-quill 自定义图片上传、文件上传
  • 数据库——MySQL数字函数和子查询
  • 交互式 AI 系统
  • C++ 极简常用内容
  • 电商---part02 项目环境准备
  • 如何根据电池电流计算电池容量
  • wsl编译openwrt24.10.0
  • dbscan 检测噪声
  • Node.js中间件的5个注意事项
  • 【Java集合】单列集合List详解
  • 基于K8s的演示用单机ML服务部署
  • 26考研——线性表_ 线性表的链式表示_双循环链表(2)
  • 多表查询的多与一
  • 对 Python Websockets 库全方位详解
  • 企业安全——FIPs
  • 面试可能会遇到的问题回答(嵌入式软件开发部分)
  • 如何在 Windows 上安装 Python
  • 新旧iPhone相册复制 - 相册图片视频对拷 - 换机 - 迁移设备数据 - 免费开源爱思助手
  • 免费在线MBTI性格测试工具 - 探索你的性格特质
  • 什么是自动化测试框架?常用的自动化测试框架有哪些?
  • 2.3 MySQL基本内置函数