1

好的。我想知道在这种情况下可能的 HTTP 状态(响应)代码是什么。

可以说,POST /Student/创建一个学生资源。假设有多个表要更新。Student资源被创建。

通常,当创建资源时,应立即在响应中返回该资源,并带有200 Successful.

但是,假设资源已创建,但当您尝试提取资源(从数据库查询)时失败。我们应该返回什么状态码?

   `201 Created`? (No resource)
   '200 Successful`? but without the resource. 
   `500 Internal Server Error`?

还有什么?

我想这是一个相当普遍的情况。

编辑

我想澄清这一点。首先,创建资源的所有 ONE POST 调用。响应应200使用 JSON 格式的资源对象。但是只有在获取资源的过程中才会报错(资源创建成功)。

无法从数据库中获取资源的原因可能是间歇性的,并且可能与服务器/网络相关,并且可以在以后识别和修复。但是资源肯定是成功创建的。

4

3 回答 3

2

假设资源已创建,但是当您尝试提取资源(来自数据库的查询)时失败

那么资源还没有被创建。它似乎只是。这肯定是服务器端错误,因此是 5xx 代码。

除非有用户提供的参数导致失败,在这种情况下它将是 4xx 代码。

更新:或者如果我误解了,并且您的意思是创建正常并返回了资源 ID,然后随后的有效GET查询没有找到该资源,那么,在这种情况下,您的服务器代码中有问题你应该早点发出 5xx 错误。一种解决方法可能是创建资源,从资源创建代码发出查询,然后返回 200 或执行清理、重试或在失败时返回 5xx。但真正应该做的是调查导致资源消失或似乎只是被创建的原因(例如并发问题、糟糕的事务管理、缓存......)。

一个复杂的场景

REST 服务请求创建资源,服务器接受该请求。服务器本身将请求路由到后端,比如说一个数据库,它返回(给服务器)“OK”和一个资源 ID。然后服务器,以防万一,检查并询问资源 ID。数据库响应,“没有这样的资源”。

在这种情况下,服务器不能出于良心向其客户端返回 200 代码和资源 ID,除非它有充分的理由怀疑客户端在尝试使用该资源 ID 时会遇到麻烦。之后的错误可能更难发现:可能客户已经发送了电子邮件或执行了涉及该 ID 的复杂操作。

因此,要么返回 500,要么服务器可以尝试修复这种情况,酌情应用以下一项或多项:

  • 稍等片刻(客户端仍在等待!)并检查资源是否重新出现
  • 尝试刷新缓存或以其他方式促使数据库占用资源
  • 使资源无效
  • 删除资源(即使它显然不存在)
  • 记录错误并将详细信息发送给管理员
  • 重复资源创建给定次数(不要太大,否则我们可能会将暂时性问题滚雪球成自我拒绝服务),直到它起作用

如果情况在合理和可容忍的(由客户端)时间内得到解决,则可以使用代码 200 返回工作资源。

当然,上述一切实际发生的原因还需要调查和补救。可能,一些“孤立”资源可能必须定期从数据库中清除(总是一个尴尬的提议)。

于 2012-12-05T23:18:51.303 回答
1

您可以选择201 Created,因为它不要求返回创建的实体。如果客户端尝试检索它,它将获得一个500 Server Error.

如果您想让客户端知道可能的服务器恶作剧,您可以 return 202 Accepted,因为它是 non-committal

不管你做什么,我建议你让这个资源是幂等的,因为它看起来有复杂的故障模式,并且客户端可能会重新尝试创建。

于 2012-12-05T23:33:12.307 回答
1

当你说:

响应应为 200,资源对象为 JSON。

响应不应该201,并且应该设置200一个标题。Location:无需在响应中包含资源表示。如果您想包含它,并且您的代码如下所示:

mysql_query('INSERT ...'); // succeeds
$id = mysql_insert_id(); // succeeds
$result = mysql_query('SELECT ...'); // times out

然后只返回没有正文的 201 。如果需要,客户端可以再次尝试获取创建的资源。

于 2012-12-06T14:47:02.173 回答