激活软件 API 适合做成 RESTful API 吗?当序列号不存在时应该返回 200 然后在返回内容中加一个状态属性还是直接 404 状态码更好?

2022-03-07 14:46:35 +08:00
 rv54ntjwfm3ug8
最近看了 RESTful API ,里面建议的是返回 404 状态码。感觉这个场合不太适合 RESTful API ,请问应该返回 200 然后 API 里再加一个状态属性还是直接 404 状态码更好?返回 404 的话感觉有一种 API 不存在的意思。

如果这个场合不适合 RESTful API ,那其它 RESTful API 应该和普通的 API 混在一起吗,还是 api/v1/ 下专门放 RESTful API ,其它 API 直接放 api/ 下?或者有什么更好的解决方案么?
2672 次点击
所在节点    程序员
14 条回复
qfdk
2022-03-07 15:04:07 +08:00
400 吧
dingwen07
2022-03-07 15:23:29 +08:00
200 ,并在返回内容中加状态属性

激活码的请求服务器可以处理,不算“malformed syntax”,因此 400 不适用。同样,服务器能够处理错误的激活码,404 也不适用。401 、403 自然也不适用。

Reference: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htm
fkdog
2022-03-07 15:26:42 +08:00
客户端提交了一个序列号,服务端可能会返回以下五种结果,
0. 激活成功
1. 提示序列号无效
2. 提示序列号已经达到设备激活上线
3. 提示序列号不适用于当前版本号
4. 提示序列号被锁定

如果你的客户端只是需要 echo 服务端返回的 message ,那么从 4xx 里调一个顺眼的即可。
但是假设现在有这么一个需求:
针对 1 ,echo 错误 message 。
针对 2 ,提示用户升级更高规格的产品服务,并打开升级页面。
针对 3 ,提示用户升级新版本序列号,并提供老客户升级优惠活动。
针对 4 ,提示用户进行解锁处理。

你发现单一一个 4xx 并不够用,实际上就算你用了 http status ,你依然需要一个 code 用来区分不同的返回结果,你总不能直接字符串去判断吧?

大公司其实也有 200 或者 400 的,没必要为了规范而规范,团队里约定好统一的处理方案即可。
harde
2022-03-07 15:33:05 +08:00
我们一般业务上的错误,Http 状态统一返回 422 ,具体错误代码、消息在返回的数据中。
Hanggi
2022-03-07 15:35:42 +08:00
你可以去看看 404 的定义,包括你所访问的资源不存在,也是 404 ,不仅仅是路径不存在。
libook
2022-03-07 15:45:02 +08:00
HTTP 状态码和业务状态码分别代表的是不同层级的状态,用 HTTP 状态码难以细分出各个业务状况,用业务状态码来代表 HTTP 状态会脱离 Web 标准化设计,所以建议两套都有,比如序列号不存在的时候,你可以认定为是客户端错误(表示 HTTP 协议层的错误信息),返回 HTTP 状态码 400 ,同时返回信息里有个业务状态代表序列号不存在。

不是所有 API 都适合用 REST 风格,你可以在路径规划上划分出哪些是 REST 、哪些不是,你可以在文档上标出哪些 API 是 RESTful 的,也可以通过类似于“/api/rest/v1”这种显眼的方式直接把 REST 和非 REST 隔离开,API 设计上最重要的是让对接双方的开发者都能看得懂,只要能达到这个目标就是好的设计。

REST 没有标准方案,只是一个 API 设计思路而已,所以你最终的设计只要符合 REST 的核心思想就可以享受 REST 带来的好处,不需要追求跟哪个具体案例一模一样。
keller
2022-03-07 20:41:09 +08:00
这种重要的验证场景还是不要用状态码来表示激活状态,很容易被劫持伪造验证状态。
数据至少要双向加密
PolarBears
2022-03-07 21:55:53 +08:00
我认为应该直接全返回 200 ,返回内容是加密后的字符串,需要在客户端解密才能读取数据再做进一步处理。
axisray
2022-03-07 23:46:53 +08:00
强烈建议后端能处理的异常用 200 ,别用什么 400/500 ,现在网络环境复杂,说不定就被什么防火墙给替换页面了(血泪教训)
axisray
2022-03-07 23:50:19 +08:00
特别有些公司运维、安全、开发是分离的,测的时候好好的,上线就挂逼,然后互相扯皮。
AyaseEri
2022-03-08 09:53:42 +08:00
建议只要请求打到你的服务器了,你能正确 handle ,一律 200
yolee599
2022-03-08 15:41:16 +08:00
服务器能收到的请求一律返回 http 状态码为 200 ,再在 body 里单独定义一个业务状态码。
zhilincom
2022-03-08 23:09:05 +08:00
@axisray #9 现在都上 HTTPS 了还会被劫持?
axisray
2022-03-11 00:32:41 +08:00
@zhilincom 看情况,有时候是在负载上统一做 https 的,内部还是 http

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838609

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX