面试复盘时,如何理解常见的HTTP状态码含义?
摘要:引言 最近面试,经常会遇见自己熟悉的八股却回答不上来,或者是磕磕巴巴,不知是自己初次面试导致紧张还是不够熟练,实在是令人感到惋惜。各位园友有什么面试的小妙招请给我示下,吾定虚心接受,感激不尽;或者大家有什么面试疑惑,也可以一起讨论,敬请期待
引言
最近面试,经常会遇见自己熟悉的八股却回答不上来,或者是磕磕巴巴,不知是自己初次面试导致紧张还是不够熟练,实在是令人感到惋惜。各位园友有什么面试的小妙招请给我示下,吾定虚心接受,感激不尽;或者大家有什么面试疑惑,也可以一起讨论,敬请期待。
常见的状态码
HTTP 状态码(Status Code)是服务器对客户端请求结果的响应标识。在面试或考试中,一般会按照5大类来说明:
1xx:信息提示
表示请求已经收到,继续处理,在实际开发中比较少见。
100 continue
含义:客户端可以继续发送请求体
一般出现在大文件进行上传时
2xx:成功
表示请求成功处理。
200 OK(最常见)
含义:请求成功,服务器正常返回数据
201 Created
含义:请求成功,并创建了新资源
通常在 POST请求(如注册新用户)成功后返回。
204 No Content
含义:请求成功,但没有返回内容
常用于DELETE或单纯的设置更新。
3xx:重定向
表示需要进一步操作才能完成请求。
301 Moved Permanently(永久重定向)
含义:资源地址永久改变
比如网站换了新域名,旧网址会永久跳到新网址。
302 Found(临时重定向)
含义:资源暂时移动
比如登录失效后自动跳转到登录页。
304 Not Modified
含义:资源没有修改,直接使用缓存
表示文件没变动,请直接使用浏览器缓存。这能极大地节省带宽并加快加载速度。
4xx:客户端错误
这类状态码通常意味着请求发出的方式不对。表示请求有问题,这是最常见的一类。
400 Bad Request
含义:请求格式错误
通常是前端传参格式不对(比如后端要JSON,你发了字符串)。
401 Unauthorized
含义:未认证
没登录,或者Token失效了。
403 Forbidden
含义:有权限验证,但没有权限
你登录了,但你只是普通用户,却想访问管理员页面。
404 Not Found(最经典)
含义:资源不存在
URL拼写错了,或者该数据已被彻底删除。
405 Method Not Allowed
含义:请求方法错误
比如后端只开了GET 接口,你却用了 POST 去刷。
5xx:服务器错误
这类状态码说明服务器内部出事了,通常需要后端开发介入排查。
500 Internal Server Error
含义:服务器代码异常
代码写错了、空指针异常、数据库连接断了等都会报这个。
502 Bad Gateway
含义:网关错误
通常是Nginx转发请求时,后面的服务器(如Python或Java服务)没启动。
503 Service Unavailable
含义:服务器暂时不可用
通常是因为服务器过载或正在维护。
504 Gateway Timeout
含义:网关请求超时
后端处理时间太长(比如查几十万条数据),导致Nginx等不下去了。
面试原题
如果状态码返回200,后端一定没有问题吗?
当时面试官问到我这个问题,直接不知道说什么,脑子短路了;本能是回答不一定,但是答完之后就不知道该说啥了,直接原地没了,思来想去还是自己实力问题,平时没有深究,囫囵吞枣的一遍过,导致面试吃大亏,只能说还得练。
正确回答:
HTTP 层面:200 只代表请求成功
不一定。HTTP 状态码 200 只表示“HTTP 请求成功处理”,并不代表后端业务一定没有问题。
返回200,说明请求到达服务器,服务器正常返回响应,但是返回的数据内容可能是错误的。
例如:
{
"code": 500,
"msg": "数据库查询失败",
"data": null
}
HTTP状态码是:
200 OK
但业务其实失败了。
业务层面:很多系统会用 200 + 业务码
在很多系统设计中:HTTP状态码表示网络请求是否成功,业务状态码表示业务是否成功。
例如:
{
"code": 0,
"msg": "success",
"data": {...}
}
或者
{
"code": 5001,
"msg": "用户不存在",
"data": null
}
此时
HTTP状态码
业务状态
200
请求成功
code=0
业务成功
code!=0
业务失败
所以:HTTP成功 ≠ 业务成功
实际开发中的典型情况
情况1:业务异常但返回200
例如用户登录:
{
"code": 1001,
"msg": "用户名或密码错误"
}
HTTP状态:
200 OK
原因:请求本身没问题,只是业务失败
情况2:接口逻辑错误但仍返回200
try {
queryUser();
} catch(Exception e) {
return Result.fail("数据库错误");
}
返回:
{
"code": 500,
"msg": "数据库错误"
}
HTTP仍然:200 ok
情况3:返回数据错误
接口返回:
{
"userId": 1,
"balance": -100000
}
HTTP:200 ok
但业务逻辑明显有问题。
