常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式

目前开发的项目很大程度上是为明年的国产化做准备了,所以借这个机会把用了十年的自研系统全部重写,订立更严格的规范,本文记录一下返回格式及对应状态码。

在这里插入图片描述

常见 HTTP 状态码及解释

HTTP 状态码用于表示客户端请求的响应状态,它们分为五类:2xx 表示成功,3xx 表示重定向,4xx 表示客户端错误,5xx 表示服务器错误。以下是各类状态码的详细解释。

2xx 成功响应

状态码含义解释
200OK请求成功,服务器返回了请求的数据。GET 请求通常返回数据,PUT/POST 请求返回更新或创建的数据。
201Created请求成功创建了新资源,通常用于 POST 或 PUT 请求。响应头包含新资源的 URL。
202Accepted请求已接受,但尚未完成处理,通常用于异步任务。
204No Content请求成功,但服务器未返回内容,常用于删除操作或不需返回内容的操作。

3xx 重定向

状态码含义解释
301Moved Permanently资源的 URL 已永久更改,客户端应重定向到新的 URL,响应头包含 Location 字段。
302Found资源的 URL 暂时更改,客户端通常会重定向到响应头中的 Location 字段。
304Not Modified资源未更改,客户端可以使用缓存版本,通常用于浏览器缓存优化。

4xx 客户端错误

状态码含义解释
400Bad Request请求有误,服务器无法处理,通常由于无效的请求参数。错误详情通常在响应体的 errors 字段中返回。
401Unauthorized未经授权,通常是由于缺少或无效的身份认证(如 Token)。
403Forbidden已认证用户无权访问该资源,即使认证通过也无法访问。
404Not Found资源未找到,通常表示客户端请求的 URL 或资源不存在。
405Method Not Allowed请求方法不被允许,例如对只支持 GET 的资源使用了 POST。
422Unprocessable Entity请求格式正确,但语义错误,服务器无法处理。例如,提交了无效的数据格式。

5xx 服务器错误

状态码含义解释
500Internal Server Error服务器内部错误,可能是未知问题或代码异常导致无法完成请求。
502Bad Gateway作为网关或代理的服务器从上游服务器收到无效响应,通常表示服务器之间的通信问题。
503Service Unavailable服务器暂时无法处理请求,通常用于服务器维护或过载。
504Gateway Timeout作为网关或代理的服务器未能在规定时间内从上游服务器获得响应。

状态码使用建议

成功场景

  • 200 OK:用于数据获取(GET 请求)和数据更新(PUT 请求)的成功响应。
  • 201 Created:用于新资源创建成功,POST 或 PUT 请求中常见。
  • 204 No Content:用于不返回数据的请求,例如删除或不需返回内容的请求。

错误场景

  • 400 Bad Request:用于无效参数错误,并返回详细的 errors 信息。
  • 401 Unauthorized:用于身份认证失败。
  • 403 Forbidden:用于权限不足时的响应。
  • 404 Not Found:用于资源不存在的情况,客户端请求的 URL 错误时常见。
  • 422 Unprocessable Entity:用于语义错误或数据校验失败,并可返回具体错误信息。

系统级别问题

  • 500 Internal Server Error502 Bad Gateway503 Service Unavailable:用于服务器内部、网关或资源不可用等问题,通常表明可以稍后重试请求。

示例响应结构

设计响应结构时,可以包含 statuscodemessagedataerrors 等字段,以便前端能快速判断响应结果。

成功响应结构示例
{
  "status": "success",
  "code": 200,
  "message": "获取用户信息成功",
  "data": {
    "user": {
      "id": 1,
      "username": "user123",
      "email": "user123@example.com",
      "phone": "12345678901",
      "role": "admin"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  },
  "errors": []
}
错误响应结构示例
{
  "status": "error",
  "code": 400,
  "message": "请求参数错误",
  "data": {},
  "errors": [
    {
      "field": "username",
      "message": "用户名不能为空"
    },
    {
      "field": "password",
      "message": "密码长度必须大于6个字符"
    }
  ]
}
错误响应格式(带有数据)
  1. 部分成功的数据: 在一些批量操作(如文件上传或数据验证)中,前端可能希望了解哪些请求成功,哪些失败,以便更好地展示处理状态。
  2. 默认值提示: 当输入缺少时,data 可以返回可用的默认值或推荐值。

如果允许在错误情况下返回 data,建议在 errors 中提供尽可能详细的说明,以便前端清楚如何使用 data 中的内容。可以考虑以下格式:

{
  "code": 400,
  "message": "请求参数错误,部分数据不可用",
  "data": {
    "user": {
      "username": "user123",     // 部分有效数据
      "email": "user123@example.com"
    },
    "defaults": {
      "role": "guest"             // 默认值或推荐值
    }
  },
  "errors": [
    {
      "field": "phone",
      "message": "手机号格式不正确"
    },
    {
      "field": "password",
      "message": "密码长度必须大于6个字符"
    }
  ]
}

结构设计建议

  • dataerrors 可共存,允许在错误响应中返回部分有效数据及详细错误信息。
  • message 提供简短描述,便于用户理解。
  • code 以 HTTP 状态码的数字形式显示,便于客户端判断请求状态。
  • codestatus 可以考虑合并

这种设计能确保数据结构清晰,便于前后端调试与维护。

### HTTP状态码429的含义 HTTP 状态码 429 表示客户端在短间内发送了过多的请求,超出了服务器设定的速率限制。这种行为通常会触发服务器的流量控制机制,从而返回 `429 Too Many Requests` 的错误响应[^1]。 当发生此错误,服务器可能会通过 `Retry-After` 响应头告知客户端需要等待多久才能再次尝试访问资源。如果未提供该头部,则需由开发者自行实现合理的重试逻辑[^2]。 --- ### 解决方案 以下是针对 `429 Too Many Requests` 错误的一些常见解决方案: #### 1. **调整请求频率** 减少单位间内发出的请求数量可以有效避免触碰服务器的限流阈值。可以通过引入延迟来降低请求速度。例如,在 Python 中可使用如下代码片段设置固定间隔间发起请求: ```python import time def make_request_with_delay(url, delay_seconds=1): while True: try: response = requests.get(url) response.raise_for_status() break except Exception as e: print(f"Request failed with {e}. Retrying after {delay_seconds} seconds...") time.sleep(delay_seconds) make_request_with_delay("https://example.com/api", delay_seconds=2) ``` 上述代码会在每次失败后暂停指定秒数再重新尝试连接目标 URL。 #### 2. **利用 Retry-After 头部信息** 部分服务端会在返回 429 状态码的同附带一个名为 `Retry-After` 的字段,指示客户应当等候多长间之后再来获取数据。遵循这个建议能够更高效地管理应用的行为模式而至于反复撞墙似的断重复相同的操作直至成功为止或者被永久封锁掉账号权限等等严重后果的发生。 假设我们接收到这样的响应: ``` HTTP/1.1 429 Too Many Requests Content-Type: application/json Retry-After: 60 ``` 这意味着程序应该至少等待一分钟后再继续执行下一轮循环中的下一个动作之前先休息片刻以便让系统恢复正常运转水平之上至于因为过度活跃而导致进一步惩罚措施加身其上也说定呢! 下面是基于 Python 实现的一个简单例子展示如何读取并处理来自远程 Web API 接口所提供的此类元数据内容作为输入参数之一参与到整个流程当中去完成终目的达成共识共赢局面形成良性互动关系链路构建起来共同推动行业发展进步向前迈进一大步吧小伙伴们加油哦!!!😊✨🎉👏💪🔥🌟🌈🌍🚀🌌💫💥👋👋👋 ```python import time from http.client import responses def handle_rate_limit(response): if 'retry-after' in response.headers and int(response.status_code) == 429: wait_time = float(response.headers['retry-after']) print( f"{responses[int(response.status_code)]}, waiting for {wait_time:.2f}s..." ) time.sleep(wait_time) handle_rate_limit(requests.Response()) # Replace this line accordingly. ``` 请注意实际部署过程中可能还需要考虑更多边界情况比如网络波动造成的异常中断等问题都需要妥善加以应对才行哟~ 😊 #### 3. **优化批量请求设计** 对于某些场景下的高频需求而言,与其单独逐条记录逐一调用接口查询详情如一次性打包提交多个实体对象列表形式的数据结构体传送给后台统一计算得出结论反馈回来更加节省精力成本同也减少了必要的通信开销提高整体效率表现优异值得推荐采用这种方法论来进行实践探索寻求突破创新之路越走越宽广未来充满无限可能性等着大家一起去发现挖掘创造价值大化成果共享繁荣昌盛新代来临之际让我们携手共进共创辉煌明天吧朋友们!!! 🎉🎊🎈🎁🏆🏅🎖️🎯💯🏆🏆🏆 举个栗子🌰:假如现在有一个订单管理系统里面包含了成千上百笔交易流水明细单据等待审核确认那么完全可以把这些待办事项集合整理好以后集中上传至云端数据库服务器那里按照既定规则自动校验筛选分类汇总统计分析后生成报表导出下载保存归档留底备查等功能模块集成于一体化综合服务平台上面供相关人员随查阅参考决策依据之用处多多益善何乐为呢?😏😉😎 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值