理论上应该返回 404
产生这个争执的根本原因是客户端并没有针对 RESTFul API 调整自己的处理逻辑
几年前写过一个客户端处理 RESTFul API 的流程伪代码,如果真的是严谨的 RESTFul API,客户端应该按如下流程处理异常
https://gist.github.com/AlloVince/4ec938b41ee2142333ca```
//请求成功返回 2XX
if (statusCode.startWith('2')) {
//请求成功,处理业务
} else {
//5XX 错误,服务器有问题
if (statusCode.startWith('5')) {
//响应格式不定,显示网络错误或未知错误给用户
} elseif (statusCode.startWith('4')) {
//4XX 错误,输入有问题
//4XX 错误后端必须保证错误格式
res = json_decode(responseBody)
switch (res.errors[0].message) {
//客户端需要处理的异常分支
case 'ERR_USER_MOBILE_CAPTCHA_CHECK_FAILED':
//验证码错误
break
//客户端无法预料的异常分支
default:
//打印错误信息
print res.errors[0].message_human
}
} else {
//未知错误
}
}
```
问题在于,这样对服务端和客户端双方人员的要求都很高,需要能理解 RESTFul 的思想,并且一直维护状态码及 API 的约定,这对于人员经常有流动,缺少 Code Review 的项目来说,几乎不可能。而一旦出现了一个例外的 API,客户端处理起来就非常麻烦。所以大部分人都会选择更不容易出错的返回 200
当然,9012 年了,GraphQL 可以用起来了
如果对这个话题有兴趣,我的 Blog 有几个相关的 PPT 可供深入了解
https://avnpc.com/about#%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB-ppt