关于在设计 API 时的一个考虑

2012-04-16 22:57:00 +08:00
 Livid
如果用户请求的时候提交了错误的参数,这个时候服务器端无法满足用户的需求,需要返回一个错误页面。

假设 API 是 JSON 格式的,那么大家做为开发者,会希望服务器端如何通知这个错误呢?

目前考虑的几种做法:

1. 返回 HTTP 400 Bad Request 状态。

2. 在所有的 JSON 反馈中都加入这样的设定:

{
"status" : "error"
}



{
"status" : "ok"
}

期待大家对这个问题的建议。
11649 次点击
所在节点    API
59 条回复
Johnny
2012-04-17 20:00:07 +08:00
参数错误应该是服务要处理的一部分,正确的应该是服务成功,返回200 但是处理结果是返回状态Error,400应该是本身服务出现问题而出现的。
zythum
2012-04-17 23:22:11 +08:00
还是统一返回200. 然后传状态码的方式
leeiio
2012-04-17 23:30:11 +08:00
基本形态,如需要返回别的就在这个基础上叠加字段
{
"code":"xxxxx",
"message":"xxxxxxx"
}
code是自己定义的错误编号代码例如E001之类的,message是方便查看输出的错误

参数错误用400状态码,比较疑惑你的status还区分ok和error的做法
egen
2012-04-17 23:57:54 +08:00
取决于是不是想做成RESTful的,如果RESTful就400
否则就200+状态码,另外很多时候RESTful在业务逻辑方面的问题的时候还是需要额外的状态码的
vagase
2012-04-17 23:59:22 +08:00
同意7楼,充分利用Http Error Code,这样也可以简化客户端的处理。可以很好的兼容第三方库,比如像iOS RestKit,针对返回不是200的统一error处理,只要返回200就表明数据正常,直接处理正常情况了。
88250
2012-04-18 00:34:02 +08:00
还是 1 + 2 比较好:

1. 对不是充分了解 response 格式约定的客户端来说也能通过 sc 大致读懂 response 意义
2. { "status": xxx } 这里最好还是使用 HTTP status codes,虽然有点重复,但能保证和 response 一致,简单。自定义状态码会显得太累赘,这只是个约定问题。

综上,示例:

{
"sc": 400,
"msg": "Required [xxx] parameter"
}

{
"sc": 200,
"msg": "Processes Successfully"
}

P.S. "msg" 在服务器处理 i18n。
wxianfeng
2012-04-18 10:16:39 +08:00
我们的

{ status: 1 }

{ status: 0, error: "xxx" }
jackyz
2012-04-18 12:49:10 +08:00
success :[0, result]
error :[1, error]
result 和 error 都是 json 。

为毛呢?

0, 符合直觉。0 = ok, 1 = err 符合“直觉”。

1, 易于解析。此形式大概也是 success 和 error 语义的“最小包装”了。在服务端,可以统一写一个 errror handler 。在客户端,可以统一 override jquery 写一个简单的解析就 ok 了。

3, 支持 jsonp 调用。
jackyz
2012-04-18 12:52:52 +08:00
example:

比如,注册:

> POST /register {name:"", pass:"123"}
< [1, {name: "is_null", pass: "too_short"}]

or

> GET /register "name=&pass=123&_method=post&callback=jsonp"
< jsonp([1, {name: "is_null", pass: "too_short"}]);
freewizard
2012-04-18 13:26:55 +08:00
@livid 两者都需要
HTTP body必须保持一个合法JSON格式,避免客户端因为异常处理不完善而出错。错误代码和信息最好也在JSON内,这样客户端内部保存和传递数据时就不需要额外的将HTTP头和JSON合并了。
HTTP status code必须为非2xx,这样对调试和运维很方便,并且避免HTTP 200误导代理或缓存服务器。
sdpfoue
2012-05-19 20:20:29 +08:00
{errno:0/1/2,errmsn:''/'some message'}
sd4399340
2012-05-19 23:08:25 +08:00
选择2
MayLava
2012-05-19 23:11:10 +08:00
觉得HTTP状态还是必要的。
至于html正文的话倒是无所谓,看需求吧。
ljbha007
2012-05-19 23:59:42 +08:00
两个一起用
这样客户端通过HTTP status code得知有错误 通过JSON得知错误类型及文字描述
arthur369
2012-05-20 08:45:58 +08:00
咦。这里好多程序员
iceseaboy
2014-05-08 12:46:06 +08:00
就想知道 为什么要把 业务逻辑 和 HTTP状态 混在一起。。。
kslr
2014-11-19 10:27:05 +08:00
一直是返回400状态 ,然后显示错误{错误码,错误信息,错误详解,比如文档连接}
system
2016-08-10 11:20:11 +08:00
@clowwindy 如果业务不同的错误类型,比如我要提现操作,可能会出现银行卡未绑定、没有上传户口本,没有上传身份证,没有绑定手机号码,没有填写住址等错误,没有余额等等。 http status 的错误码是多少 看了文档没有找到意思一样的、
system
2016-08-10 11:20:19 +08:00
@kslr 如果业务不同的错误类型,比如我要提现操作,可能会出现银行卡未绑定、没有上传户口本,没有上传身份证,没有绑定手机号码,没有填写住址等错误,没有余额等等。 http status 的错误码是多少 看了文档没有找到意思一样的、

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

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

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

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

© 2021 V2EX