面试复盘---常见的状态码
引言[*]最近面试,经常会遇见自己熟悉的八股却回答不上来,或者是磕磕巴巴,不知是自己初次面试导致紧张还是不够熟练,实在是令人感到惋惜。各位园友有什么面试的小妙招请给我示下,吾定虚心接受,感激不尽;或者大家有什么面试疑惑,也可以一起讨论,敬请期待。
常见的状态码
[*]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
[*]但业务逻辑明显有问题。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]