我有一个处理发票的REST API。现在,每张发票在获得资金后都有一个特殊的“费用清单”。尽管并非全部都是要资助的。我有一个端点,它提供有关每个发票的此费用清单的信息。因此,如果发票已经融资,则返回200,如果发票尚未融资(因此资源尚不可用,但将可用),我将返回202,但是如果发票不打算融资(资源不可用且从不在这种情况下将是)?
我想使用:
2xx-找不到与情况相符的代码
3xx-不同意“客户必须采取其他措施才能完成请求”
4xx-不赞成“错误似乎是由客户端引起的”
5xx-不同意“服务器无法完成请求”
有什么想法吗?谢谢!
答案 0 :(得分:2)
我有一个端点,该端点为每个发票提供有关此费用清单的信息。因此,如果发票已经融资,则返回200,如果发票尚未融资(因此资源尚不可用,但将可用),我将返回202,但是如果发票不打算融资(资源不可用且从不在这种情况下将是)?
在REST中要理解的重要一点是,元数据(状态代码,标头)描述的是资源(文档),而不是域实体。
有时候,这个想法表达为“您的资源模型不是您的域模型”。
您的特定域客户端应该正在查看响应的有效负载;元数据描述了超媒体资源本身与域无关的问题,因此通用组件(浏览器,缓存,代理,蜘蛛)可以做出贡献。
表达相同想法的另一种方法:我们真正在做的是来回发送消息。特定于域的客户端的消息属于有效负载;这样您就可以与客户交流发票的情况。元数据用于描述“该特定消息应缓存多长时间?”之类的东西。
如果我正在设计您的API,则大多数响应将使用200 OK
作为状态代码;偶尔出现404 Not Found
时,目标URI可能出现拼写错误。
(我可能不会像您描述的那样使用202 Accepted,因为语义含义有所不同-202
更接近于“我理解您的请求,但是它会占用我一些时间准备好文档”)
答案 1 :(得分:1)
首先,重要的是要强调status codes旨在表示服务器试图理解并满足客户请求的结果。
因此,如果 resource不可用表示该资源不存在(因此找不到该资源的表示形式),那么404
是一个相当合理的选择:>
404
(未找到)状态码表示原始服务器未找到目标资源的当前表示或不愿意透露该资源的存在。
从您的问题中,我可以理解,不打算供资并不意味着该资源不存在任何表示形式。因此,如果资源存在(并且有它的表示形式),那么200
似乎就可以了:
200
(确定)状态码表示请求已成功。
答案 2 :(得分:0)
根据https://tools.ietf.org/html/rfc7231#section-6.5.4:
404(未找到)状态代码表示原始服务器已执行 找不到目标资源的当前表示或找不到 愿意透露存在。 404状态码不 指出这种缺乏代表性是暂时的还是 常驻; 如果410(消失)状态代码优先于404,则优先于404 原始服务器知道 [...] 这种情况很可能是永久的。
还有:
状态代码410(已消失)指示原始服务器上不再可以访问目标资源,并且这种情况很可能是永久的。
因此,如果您拥有/invoice/123/feelist
之类的资源,并且该资源将永远不可用,那么您可以得到的最接近的资源是410
,因为404
没有关于条件是否是永久的。