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

文章目录


前言

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

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

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

二、具体返回方法示例

1) 2xx 成功类

  1. 示例

    csharp 复制代码
    // 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. 示例

    csharp 复制代码
    // 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. 示例

    csharp 复制代码
    // 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. 示例

    csharp 复制代码
    // 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. 示例

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

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

  1. 示例

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

3)自定义状态码结果

  1. 示例

    csharp 复制代码
    // 继承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的设计要求

相关推荐
会飞的鱼先生6 小时前
Node.js-http模块
网络协议·http·node.js
G等你下课15 小时前
AJAX请求跨域问题
前端·javascript·http
用户87621910624518 小时前
【计算机网络】HTTP 版本
http
拾光拾趣录18 小时前
无状态协议下的用户状态管理:Web应用如何保持用户登录态
前端·http·https
摘星编程18 小时前
深入理解责任链模式:从HTTP中间件到异常处理的实战应用
http·设计模式·中间件·责任链模式·实战应用
游戏开发爱好者81 天前
iOS重构期调试实战:架构升级中的性能与数据保障策略
websocket·网络协议·tcp/ip·http·网络安全·https·udp
2501_916013741 天前
iOS 多线程导致接口乱序?抓包还原 + 请求调度优化实战
websocket·网络协议·tcp/ip·http·网络安全·https·udp
路长且阻2 天前
网络协议(TCP/IP、HTTP、HTTPS)
网络协议·tcp/ip·http
吴free2 天前
mac电脑wireshark快速实现http接口抓包
网络·测试工具·http·wireshark
THMOM912 天前
TinyWebserver学习(9)-HTTP
网络协议·学习·http