一、HTTP 状态码

介绍

HTTP响应状态码是用以表示网页服务器HTTP响应状态的3位数字代码。它由HTTP协议定义,用于描述请求 - 响应过程中的各种状态,帮助客户端(如浏览器)理解服务器的响应结果。

打开Chrome浏览器——F12——网络,查看响应标头。

HTTP状态码五个类别

1xx: 信息性状态码

状态码 状态码英文 描述
100 Continue 服务器已经收到了请求的初始部分,客户端应该继续发送请求
101 Switching Protocols 服务器根据客户端的请求切换协议

2xx: 成功状态码

状态码 状态码英文 描述
200 OK 请求成功,通常用于 GET 请求
201 Created 请求成功,并且创建了新的资源
202 Accepted 请求已被接受处理,但处理尚未完成
204 No Content 请求成功,但没有返回任何内容
205 Reset Content 告诉客户端重置发送了请求的文档

3xx: 重定向状态码

状态码 状态码英文 描述
300 Multiple Choices 表示有多个选择,客户端可以选择其中一个
301 Moved Permanently 资源已被永久移动到新的 URL
302 Found(之前是 “Moved Temporarily”) 资源临时移动到新的 URL
303 See Other 告诉客户端在另一个 URL 上获取资源
304 Not Modified 资源未修改,可以使用缓存版本
307 Temporary Redirect 资源临时移动到新的 URL,与 302 类似,但不会改变请求方法
308 Permanent Redirect 资源已被永久移动到新的 URL,与 301 类似,但不会改变请求方法

4xx: 客户端错误状态码

状态码 状态码英文 描述
400 Bad Request 请求格式错误,服务器无法理解
401 Unauthorized 请求需要用户认证
403 Forbidden 服务器理解请求,但拒绝执行
404 Not Found 请求的资源不存在
405 Method Not Allowed 请求的 HTTP 方法不被允许
406 Not Acceptable 服务器无法生成符合客户端要求的响应
408 Request Timeout 请求超时,服务器等待了太长时间
409 Conflict 请求与服务器上的资源状态冲突
410 Gone 请求的资源已被永久删除

5xx: 服务器错误状态码

状态码 状态码英文 描述
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能
502 Bad Gateway 作为网关或代理的服务器从上游服务器收到了无效的响应
503 Service Unavailable 服务器目前无法处理请求,可能是临时超载或维护
504 Gateway Timeout 作为网关或代理的服务器没有及时从上游服务器收到响应
505 HTTP Version Not Supported 服务器不支持请求的 HTTP 协议版本

参考资料:HTTP 响应状态码

二、业务状态码

介绍

业务状态码是应用层定义的状态码,用于描述具体业务逻辑的处理结果。它与HTTP状态码不同,HTTP状态码主要关注协议层面的通信状态,而业务状态码关注的是应用逻辑是否成功、失败以及失败的具体原因等。

  • 自定义性:业务状态码是根据具体业务需求定义的。
  • 详细性:业务状态码可以更详细地描述业务逻辑的处理结果。

区别与联系

在前后端交互中,HTTP状态码业务状态码是两种不同的错误处理机制,它们的用途和触发方式不同:

对比项 HTTP状态码 业务状态码
定义 由HTTP协议定义的标准状态码(如200、401、404、500) 后端自定义的业务逻辑状态码(如 { code: 401, msg: "未登录" }
触发方式 由服务器直接返回HTTP响应头(如 HTTP/1.1 401 Unauthorized 由后端在HTTP 200响应体里返回(如 { code: 401, data: null }
Axios拦截器处理 触发 response.interceptors 的 错误回调(error.response.status 触发 response.interceptors 的 成功回调(response.data.code
典型用途 表示HTTP请求本身的成功/失败(如网络错误) 表示业务逻辑的成功/失败(如余额不足、权限不足)

业务状态码示例

用户登录失败时,服务器响应数据如下:

  • code:业务状态码
  • data:服务器返回数据
  • msg:服务器返回消息提示
{"code":111201,"data":null,"msg":"账号或密码错误"}

注意:虽然是发生业务逻辑错误,但此时的 HTTP 状态码仍然为 200

三、项目实战

一个Django+DRF的后台管理系统项目,设计并使用业务状态码,可拆分为以下步骤:

设计业务状态码

设计业务状态码分配规则

  • 范围:100000 - 999999
  • 第一段,2 位,表示应用APP。例如:myapp_system, myapp_infra
  • 第二段,2 位,表示模块。例如:user, dept
  • 第三段,2 位,表示自增数字。

业务状态码具体分配示例

一、项目框架预留
framework-exception 101100 - 101199 二、myapp_system 应用APP
system-user 111100 - 111199
system-auth 111200 - 111299
system-dept 111300 - 111399
system-post 111400 - 111499
system-role 111500 - 111599
system-menu 111600 - 111699
system-user_profile 111700 - 111799
system-notify_message 111800 - 111899
system-permission 111900 - 111999
system-dict_type 112000 - 112099
system-captcha 112100 - 112199 三、myapp_infra 应用APP
infra-job 121100 - 121199
infra-file_config 121200 - 121299
infra-file 121300 - 121399
infra-config 121400 - 121499

设计全局响应格式

封装DRF的Response类,定义通用响应工具类

from rest_framework.response import Response
from rest_framework import status class CommonResponse:
"""通用响应工具类""" @staticmethod
def success(code=0, data=True, msg="", status_code=status.HTTP_200_OK):
"""业务成功响应"""
return Response(
{
"code": code, # 业务状态码为 0 表示成功
"data": data,
"msg": msg,
},
status=status_code, # HTTP 状态码默认为200
) @staticmethod
def error(code=500, data=None, msg="Error", status_code=status.HTTP_200_OK):
"""业务错误响应,配合业务状态码使用"""
return Response(
{
"code": code,
"data": data,
"msg": msg,
},
status=status_code,
)

业务状态码实战

实战场景:用户登录过程中,可能出现账号或密码错误、用户已停用等情形。此时需要用到业务状态码进行友好提示。如下图所示:

代码实现效果:当账号或密码错误

代码实现效果:当用户已停用

代码实现效果:当登录成功

点击查看完整代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

Django实战:HTTP状态码与业务状态码的分层设计与实战应用的更多相关文章

  1. 跳转常规 -- 为什么不要使用404、500等http状态码作为业务代码响应

    不要使用HTTP状态码作为业务代码响应 HTTP状态码 是指浏览器访问网址,成功或异常时浏览器或服务器告知用户的代码数字,它指的是网络或服务器的状态,有着不同的含义. 参加MDN.Java Api,常 ...

  2. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  3. 突破传统监测模式:业务状态监控HM的新思路

    作者:京东保险 管顺利 一.传统监控系统的盲区,如何打造业务状态监控. 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不在赘述.这里主要讲如 ...

  4. git实战-linux定时监控github更新状态(二)

    系列文章 git介绍-常用操作(一)✓ git实战-linux定时监控github更新状态(二)✓ 本文主要内容 如何查看github的本地仓库和远程仓库的同步情况 linux服务器定时监控githu ...

  5. 使用Nagios打造专业的业务状态监控

    想必各个公司都有部署zabbix之类的监控系统来监控服务器的资源使用情况.各服务的运行状态,是否这种监控就足够了呢?有没有遇到监控系统一切正常确发现项目无法正常对外提供服务的情况呢?本篇文章聊聊我们如 ...

  6. 【10-2】复杂业务状态的处理(从状态者模式到FSM)

    一.概述 我们平常在开发业务模块时,经常会遇到比较复杂的状态转换.比如说用户可能有新注册.实名认证中.已实名认证.禁用等状态,支付可能有等待支付.支付中.已支付等状态.OA系统里的状态处理就更多了. ...

  7. 重构学习day01 类型码 类型码的上层建筑 与类型码相关的重构方法 1.使用子类代替类型码 2.使用状态或策略模式代替类型码

    名词:类型码 类型码的上层建筑 重构方法 1.使用子类代替类型码 2.使用状态/策略模式代替类型码 类中存在方法把某个字段当作条件,根据字段值的不同,进行不同的处理.(自定义概念)则这个字段叫做:类型 ...

  8. 从Linux源码看TIME_WAIT状态的持续时间

    从Linux源码看TIME_WAIT状态的持续时间 前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右.线上实际却存在TIME_WAIT超过100s的Socket ...

  9. 「小程序JAVA实战」java-sesion的状态会话与无状态会话(38)

    转自:https://idig8.com/2018/09/02/xiaochengxujavashizhanjava-sesiondezhuangtaihuihuayuwuzhuangtaihuihu ...

  10. DirectX11 With Windows SDK--11 混合状态与光栅化状态

    前言 虽然这一部分的内容主要偏向于混合(Blending),但这里还需提及一下,关于渲染管线可以绑定的状态主要有如下四种: 光栅化状态(光栅化阶段) 采样器状态(像素着色阶段) 混合状态(输出合并阶段 ...

随机推荐

  1. 【Linux】5.6 Shell打印输出指令

    Shell打印输出命令 1. echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出.命令格式:echo string 您可以使用echo实现更复杂的输出 ...

  2. SQLite 下载与安装

    安装 SQLite 官网 就2个文件,下载解压到一起即可 这里不是安装包的形式,下载后是下面这2个文件: 解压到同一目录下即可,如图: "安装"完成后,记得添加系统环境变量,以便命 ...

  3. ASP.NET之设置默认文档

    通常... <!--Web.config--> <configuration> <!--指定默认文档 Start Author:JAnnn Time:2015-01-10 ...

  4. 轻松的工作(deepseek)

    组长:"这里有一百多个地震波形文件,把每一个地震建立一个文件夹,并把地震波形放到对应日期的地震中." 我想:一个一个整好麻烦想摸会鱼 让我们来deepseek吧~ 首先,生成文件夹 ...

  5. SQL慢查询经历与解决方案

    一.问题背景 现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下: 我在测试环境构造了500万条数据,模拟了这个慢查询. 简单来说,就是查询一定条件下, ...

  6. Springboot+MongoDB添加数据时会自带_class字段

    _class字段作用 帮助映射子类,为了方便处理Pojo中存在继承的情况,增加系统的扩展性 去除_class字段 新增mongodb的配置类,配置mappingMongoConverter,配置类网上 ...

  7. idea远程访问docker查看控制台中文乱码问题

    今天心血来潮想把自己的项目部署到docker,部署完成后通过idea远程访问docker.发现控制台日志出现中文乱码,起初还以为docker或者项目编码没有设置好,一一排查后发现服务器编码和环境都没有 ...

  8. Windows IntelliJ IDEA 快捷键终极大全

    自动代码 常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 . 例如要输入for(User user : users)只需输 ...

  9. 《Beating Floating Point at its Own Game: Posit Arithmetic》(一)

    这段话描述了 Posit数制 在 动态扩展位数(追加比特) 时如何插入新的数值,并保持数值在数轴(或"数环")上的分布特性.以下是逐条解析: 1. Posit数值的动态扩展规则 P ...

  10. 解决 podman 容器无法在宿主机和容器内部相互访问问题的记录

    解决 podman 容器无法在宿主机和容器内部相互访问问题的记录 近期在使用 podman 时,遇到了容器无法在宿主机和容器内部相互访问的问题.经过一番探索,参考了这篇文章,成功解决了该问题.在此,我 ...