API 使用 HTTP 状态码还是全部返回 200

2015-05-16 15:43:29 +08:00
 schemacs

如题,方案一:所有就是只以HTTP状态码来表示状态,200时候返回内容就是数据,最多有个分页(其实分页我都不想放响应内容里,我觉得像github那样放到header更整洁)。

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            ...
        }
    ]
}

只有在抛出Exception异常(即使业务逻辑上有问题,也抛出APIException异常)才返回:

HTTP/1.1 405 Method Not Allowed
Content-Type: application/json

{"status_code": 405, "message": "Method 'DELETE' not allowed."}

方案二:所有接口都返回200(我觉得有点不切实际,比如403,500等,再加上很多客户端http库都会对这些抛异常的),然后响应里包含:

{
    "status_code: 1000
    "message": "xxxxx"
    "result": {
        "id": 1
        ...
    }
}

现在貌似很多客户端开发都希望是方案二,因为这样他们逻辑会简单些(200以外全去捕获异常,200时再看status_code做不同处理),但是作为服务端更倾向于方案一,因为大多框架和各家提供的API都是这么干的,其实也很简单(先看状态码,然后直接根据状态码决定后续动作)。

在两个方案中纠结,来请大家给点建议哈~

以前都是在SO上发帖,第一次在v站发帖,如有没说清楚或者违反社区原则的地方,请大家不吝指出。

28928 次点击
所在节点    程序员
65 条回复
pubby
2015-05-18 00:44:26 +08:00
@jokester 同意,RESTful就像流行时尚,某年流行洞洞鞋,好了,本来人字拖好好的也要换个洞洞鞋穿
anyforever
2015-05-18 10:17:12 +08:00
刚刚看到一篇相关的,推荐之。http://zhuanlan.zhihu.com/prattle/20034107
invite
2015-05-18 12:37:23 +08:00
@schemacs 状态码不能满足的情况下,用错误代码,那不是得两套逻辑了?那何必搞那么复杂呢?
ajianrelease
2015-05-18 16:02:36 +08:00
同意@invite,感觉方案二好
benjiam
2015-05-21 21:45:37 +08:00
英语是最好的语言,所以 问好请说 是不是你很好。restful很好?挺傻的。有本事不依靠HTTP协议,自己独立的设计一套协议

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

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

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

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

© 2021 V2EX