【发布时间】:2015-10-27 20:32:11
【问题描述】:
在使用 REST API 响应 PUT 或 POST 命令时,我几乎没有发现有关最佳实践的详细信息。
假设该示例是 API 用于电影商店中的电影列表,并且具有以下内容:
- 获取 api/电影
- 获取 api/电影/{id}
- PUT api/电影/
- PUT api/电影/{id}
- POST api/电影/
- POST api/电影/{id}
您可以在其中放置或发布单个或集合。我将两者都包括在内是因为我不想讨论有关 PUT 与 POST 的问题,并且希望获得有关最佳实践的答案,尤其是在对错误的响应方面。
如果处理单个项目,我可以轻松返回 HTTP 状态代码和响应,但是在处理集合的 POST 和 PUT 时应该怎么做,尤其是在非幂等方法中?
我对退货的想法如下:
{
"version": "1.0"
"status": 200,
"errors": [
// List of object id's, and errors
]
"data": [
// List of movies POSTed or PUT
]
}
为每个失败的特定 ID 生成错误,但我不确定它是否通过了关于整体状态和 HttpStatus 的气味测试。如果集合的一部分失败或单个实体失败,我应该返回另一个状态吗?
【问题讨论】:
-
状态码应该用来表示传输的状态。服务器配置问题和未处理的异常通常会导致代码 500。找不到资源、未经授权的访问等通常会导致代码 4xx。代码 200 表示服务器验证了请求并发送了有效响应。有效响应 200 的有效负载的确定取决于您的 api 的语义。
-
我喜欢使用 HTTP 303 来重定向成功的 POST/PUT 请求。我永远不会在 HTTP 200 中包含错误有效负载,除非此类错误不会阻止请求完成:也就是说,新资源已创建 (POST) 或更新 (PUT),但附加条件导致非致命错误。
-
@lrb - 这是我对有效负载响应的假设;传输成功处理中的错误。我没有看到有关此标准的详细信息以及响应集合,并且不同站点上的简短信息充其量是矛盾的。也就是说,许多 API 也使用状态码进行处理(例如 Twitter)。
-
@Palpatim - 我特指一组(几个)POST/PUT 项目。你是说你会为整个集合返回一个错误代码,如果一个项目已经失效,你不会处理任何项目?在幂等操作中,我认为 1 项不应该阻止整个发送......当然,我不确定,因此我的问题。
-
Evert 的回答很好地解释了我的立场。如果请求确实是幂等的,那么整个请求必须成功或失败,如果请求的一个元素失败,则错误是预期的响应。考虑一种事务模型,例如在 DBMS 中实现的——如果一条记录更新失败,则必须回滚整个事务。