2015-10-27 77 views
3

我发现使用REST API响应PUT或POST命令时最佳实践的细节非常少。收集REST API后的JSON响应

假设的例子是,API是在电影存储电影的列表,并有以下几点:

  • 获取API /电影
  • 获取API /电影/(编号)
  • PUT API /电影/
  • PUT API /电影/(编号)
  • POST API /电影/
  • POST API /电影/(编号)

您可以在哪里放置或发布单个或集合。我将两者都包括在内,因为我不想讨论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。如果一部分收集失败或一个实体出现故障,我是否应该返回另一个状态?

+1

状态码应该用来表示传输状态。服务器配置问题和未处理的异常通常会导致代码500.资源未找到,未经授权的访问等通常会导致代码4xx。代码200指示服务器验证了请求并发送了有效的响应。有效响应的有效负载200的确定取决于你的api的语义。 –

+0

我是使用HTTP 303重定向成功的POST/PUT请求的粉丝。我绝对不会在HTTP 200中包含一个错误有效负载,除非这样的错误不能阻止请求完成:也就是说,新的资源是创建(POST)或更新(PUT)的,但是如果附加条件导致非负载致命错误。 – Palpatim

+0

@lrb - 这是我对我的有效负载响应所假设的;传输过程中成功的错误。我还没有看到有关这方面的标准的详细信息与收集的答复,而且不同网站上的简要信息最多也是矛盾的。也就是说,许多API使用状态码进行处理(例如,twitter)。 – LimpingNinja

回答

4

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

所以你问的只是REST能为你做的事情。从马的口中:

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

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

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

+0

看来你有不同的解释,即使我已经给出了两个单独的答案。我认为这是一个简单的批量操作,因为它不符合我想象的批处理操作的标准。它没有(a)在一个操作中处理不同的有效载荷类型;或(b)由完成单个交易的多个请求组成。因此,您的评论:“REST可为您做的事情”之外的内容会混淆,因为当前REST API的显示收集操作的性质以及尝试的标准(JSONapi,OData等)对批量操作进行列表操作。 – LimpingNinja

+0

我已经接受了基于Atomicity评论的答案。我基于收藏的行为不会修改单数项目,而仅仅是原子和幂等的。在任何我不会完全替换数据的情况下,我计划继续维护原子性,并通过返回的错误代码和错误列表使事务失败;无论如何。谢谢你的回应,Evert。 – LimpingNinja

+0

至于你对JSONapi和OData的观点,如果他们提供批量操作,那些操作本身可能不是RESTful。这并不意味着它不是一个有效的API设计,或者HTTP的有效使用......它只是不是REST。 – Evert