定义状态代码

时间:2014-06-05 13:43:48

标签: api http rest response

我正在为Web应用程序内部的第三方api(电子邮件套件)构建一个包装器,可以通过内部和自己的api访问。例如,这些方法将电子邮件地址和订阅列表作为参数并返回结果代码。

基本上我想:

定义状态代码以显示不同的成功/失败状态。

例如成功:

  • 创建新联系人
  • 创建新联系人并发送
  • 已创建新联系人并已发送优惠券
  • 现有联系人订阅
  • 现有联系人已订阅并已发送优惠券
  • 依旧......

所有这些案例基本上都属于2xx类,但必须触发不同的用户反馈消息,这就是我对使用HTTP status codes不满意的原因。使用纯HTTP状态代码不能提供足够详细的反馈并定义a)附加状态代码或b)完全自定义状态代码感觉如此随机。

那么,去这里的最佳做法是什么?

This answer建议我应该始终使用标准HTTP状态代码,如果它们不适用,我的设计是错误的。如果不在客户端使用额外的逻辑和api调用,我如何区分差异?

2 个答案:

答案 0 :(得分:5)

HTTP状态代码的目的是传达 HTTP操作的状态 - 成功,未授权,待处理,配置错误等等。在您描述的所有情况中,请求的操作都是成功的 - 一切都按计划进行。所以最有可能的状态代码是200 OK或201 CREATED for all cases。

不应将其他特定于域的状态强行敲入HTTP状态。只需在回复中返回其他字段即可。例如:

POST http://www.example.com/users
{
    name : "The User",
    email : "email@theuser.com"
}

回复将包含:

201 CREATED
{
    status : "Optin mail sent",
    timestamp : "...",
    ...
}

这样可以更清晰地分离关注点并提高可扩展性。

答案 1 :(得分:3)

  

如果不在客户端使用额外的逻辑和api调用,我如何区分差异?

使用有意义的回复机构。状态代码就是这样。您不想为每个新的结果组合创建新的HTTP状态代码。

所以对于前三个场景:

HTTP/1.1 201 Created
...

{
    contact_created: "true",
    optin_mail_sent: "true",
    coupon_sent: "true",
}

您需要在客户端以任何方式显示某些显示逻辑(例如,从254 ContactYesOptInNoCouponYes到相应的通知),因此响应主体似乎是最明智和可扩展的方式。