【发布时间】:2020-04-14 14:42:14
【问题描述】:
假设调用者向 REST 服务器发送 POST 请求以创建资源。服务器创建资源并返回 201。
现在,如果资源创建成功,服务器代码将被修改以执行其他操作。这些操作可以是任何东西——为簿记创建另一个资源、更新另一个资源等。
如果这些依赖操作中的任何一个或所有失败,服务器应该向调用者返回 201(因为创建了预期的资源)还是导致失败(即使调用者不知道/不关心这些依赖资源)?
【问题讨论】:
假设调用者向 REST 服务器发送 POST 请求以创建资源。服务器创建资源并返回 201。
现在,如果资源创建成功,服务器代码将被修改以执行其他操作。这些操作可以是任何东西——为簿记创建另一个资源、更新另一个资源等。
如果这些依赖操作中的任何一个或所有失败,服务器应该向调用者返回 201(因为创建了预期的资源)还是导致失败(即使调用者不知道/不关心这些依赖资源)?
【问题讨论】:
HTTP 响应与请求相关,如果成功则返回将始终成功。例如,在数据库中列出一个应该有数据但为空的表,将成功返回,因为默认目标只是列出该表。
您可以在此处找到所有响应代码的定义:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
可以使用编程语言来处理 API 的返回,方法是创建条件以根据您理解的是否为成功请求返回自定义 HTTP 响应。
【讨论】:
大部分 HTTP 规范的编写方式是请求通常要么完全成功,要么完全失败。
但是,可以对此应用一些细微差别。
如果修改了服务器状态,并且打算像您这样的 HTTP 请求可以做一件或多件事情,我认为您可以认为这是“成功”,您应该返回 2XX 响应。
如果我收到 4XX 响应,那么该请求应该完全失败。
【讨论】:
当您返回 HTTP 状态 201 时,您应该返回在响应中创建的资源,如果操作失败,您一开始就不应该返回 201。
无论如何,HTTP 状态码主要用于检查请求本身的状态,而不是其背后的逻辑。更好的方法是在请求本身成功时始终返回 200。在响应正文中,您可以返回有关操作的更多信息,例如操作是否成功的布尔值,以 JSON 格式。
【讨论】: