【问题标题】:JSON response for REST API post for collections集合的 REST API 帖子的 JSON 响应
【发布时间】: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 中实现的——如果一条记录更新失败,则必须回滚整个事务。

标签: json api rest


【解决方案1】:

通常在 REST 中,操作需要完全成功或完全失败。像这样的操作应该是原子的和幂等的。

因此,您所问的只是 REST 可以为您做的事情之外的事情。从马口中:

“如果您发现自己需要批处理操作,那么很可能您没有定义足够的资源。”

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-743

那么这句话是什么意思?这并不意味着您不能拥有与其他几个资源(例如:您的收藏)表示相同数据的资源,但如果您使用PUT 更新它,您仍然可以 100% 替换它的内容。不是部分。

【讨论】:

  • 看来您的解释与我给出的不同;即使我给出了两个单独的答案。我认为这是一个简单的批量操作,因为它不符合我想象的批量操作的标准。它不会 (a) 在一个操作中处理不同的有效载荷类型;或 (b) 包含完成单个事务的多个请求。因此,您的评论:“REST 可以为您做的事情之外”令人困惑,因为当前 REST API 的显示收集操作的性质以及尝试的标准(JSONapi、OData 等)列出了批量操作。
  • 我已经接受了这个基于 cmets 引用原子性的答案。我的基于集合的操作不会修改单个项目,而只会是原子的和幂等的。在我不会完全替换数据的任何情况下,我计划仍然保持原子性并通过返回的错误代码和错误列表使事务失败;无论如何。感谢您的回复,埃弗特。
  • 至于您关于 JSONapi 和 OData 的观点,如果它们提供批量操作,那么这些操作本身可能不是 RESTful。这并不意味着它不是一个有效的 api 设计,或 HTTP 的有效使用......它只是不是 REST。
  • 您对批量操作如何违反架构约束并导致 API 不是 RESTful 有任何引用吗?我真的对推理很感兴趣。您自己突出显示的原始帖子没有说明这一点,引用也没有说明。如果我 GET Api/Movies 并返回一个电影集合,然后简单地 PUT Api/Movies 与相同的集合(尽管已修改),如果事务是无状态和原子的,这如何违反 RESTful 架构?
  • 嗨 Kaylus,如果您使用的是 PUT 并且您正在完全替换现有的集合,那么它仍然是 RESTful。我只是在谈论'批量操作',但公平地说,我不知道它们是如何在 JSONapi/OData 中实现的。所以我是 100% 推断的。
猜你喜欢
  • 2017-06-20
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多