正如其他人所说,没有通用约定。 REST“社区”仍在就这些问题寻找一些共识——可能永远也找不到共识。举几个例子:
状态码
默认情况下,ServiceStack.NET(一个广泛使用的 C# REST 库 Web 服务框架)返回带有状态码的对象(或空响应),例如:
201 Created
或者:
200 OK
在验证错误的情况下(例如ArgumentException),它可能会这样做,例如:
400 Bad Request
这已经是事情开始发生变化的第一个点。有些人喜欢 400 状态代码来表示验证错误之类的事情 - 其他人则不喜欢,因为 400 确实在请求格式本身中表示格式错误的语法。
有些人更喜欢 422 Unprocessable Entity 验证错误,它是 HTTP 协议的 WebDAV 扩展,但在技术上仍然完全可以接受。
其他人认为您应该简单地采用 HTTP 协议中未使用的错误状态代码之一,例如461。 Twitter 已经通过(除其他外)420 Enhance Your Calm 来通知客户他们现在受到速率限制 - 即使有一个 (表面上) 可接受(和推荐)状态代码 @987654334 @ 已经为此目的了。
等等。这都是哲学问题。
至于500 Internal Server Error,同样适用——有些人认为它对于各种错误响应都很好,其他人认为5xx错误应该只在异常时返回(实际上意义 - 即异常错误)。如果错误确实是异常的,那么您通常不想冒险并传递任何实际的异常信息,这可能会透露太多有关您的服务器的信息。
引导我们在 JSON 结果中返回什么(如果有的话)?一样的……
回应
200 OK 可能足以响应例如如果没有发生错误,则请求删除资源。同样,404 Not Found 足以告诉客户端由于找不到要删除的实体而无法执行请求的删除。在其他情况下,您可能需要更多。
有些人认为您应该在响应标头中包含尽可能多的所需信息,通常是只有标头的空响应。例如,在创建时,返回 201 Created 并将创建的实体的 ID(作为资源 URI)放入 Content-Location。无需响应内容。
我个人认为,如果您要创建公共 API,最好同时返回适当的标头和内容,即使内容有些多余。即:
HTTP/1.1 404 Not found
Content-Type: application/json; charset=utf-8
...
{
'Success': false,
'Message': 'The user Mr. Gone wasn't found.'
}
(我实际上并没有包含 Success 属性,但我可能想要,这取决于我在设计 API 时的心态)。
在调试模式下运行时,我还包括内部服务调用的字符串表示 - 例如'Request': 'GetUser { id: 5 }'、时间戳和堆栈跟踪。不过,这一切都是为了方便。只需基于404 Not found,就可以很容易地为客户端编写适当的用户友好错误消息。不过,其他一些错误(例如验证)可能需要更多上下文。例如:
HTTP/1.1 422 Validation Error
Content-Type: application/json; charset=utf-8
...
{
'Success': false,
'Message': 'The request had validation errors.',
'Errors':
{
'UserName': 'The user name must be provided.',
'Email': 'The email address is already in use.'
}
}
ServiceStack.NET 支持something like this by default,但属性和内容略有不同。微软自己的 Web API 框架does something similar。
related question 中链接的 JSend 规范是另一种变体。
等等。
简而言之,不,没有任何通用约定 - 至少现在还没有。很多人(比我投入更多的想法)正在研究它。但是,可能永远不会有。而且你的方法完全可以接受。
(是的,这很长 - 主要是因为我一直在寻找相同类型的“通用约定”)。
有关状态码的更多信息,this is an excellent article (too long to quote here)