当资源等待电子邮件 confirmation/activation 时,202 Accepted 是否合适?

Is 202 Accepted appropriate when a resource awaits email confirmation/activation?

对于我正在开发的 REST API,客户可以注册一家公司,随后需要通过电子邮件 confirmation/activation。收到以下示例请求后,将发送一封电子邮件,其中包含激活 link,以激活帐户。

POST /companies HTTP/1.1

<company>
  <name>CoolCompany</name>
  <email>coolcompany@example.com</email>
</company>

如果上述请求成功(有效数据,电子邮件成功发送),公司资源将保存在数据库中,但仅在 /companies/<id> 可用(给予适当的授权 header ) 收到确认后。

鉴于这种情况,是

HTTP/1.1 202 Accepted
// Perhaps optionally with a Location header, 
// of where the resource will be available, as well?
Location: /companies/<id>

适当的回应?或者会

HTTP/1.1 201 Created
Location: /companies/<id>

是一个更合适的回应?

我的想法是:

201 - 当所有 stuff/processing 在请求结束时完成(填充数据库、创建文件等),因此当客户端(立即事件)获取资源时,他将收到资源。

202 - 收到请求并成功开始处理,但根据流程的某些限制,没有处理所有与请求相关的活动。

你的情况:

如果同步发送电子邮件并且在发送电子邮件之前不return回复,那么我猜 201(Created) 没问题

例如,如果您将电子邮件发送任务设置到队列中并return立即发送给客户端,电子邮件可能会稍后发送(或者例如,在发送电子邮件之前操作员对新客户进行了一些手动处理) 比 202 好。

REST 是一个基于实体的概念。如果我收到 201 Created 响应,这将直观地表明资源已创建并且可用,但这种情况并非如此。该资源在确认后首先可用,因此我建议使用 202 Accepted header。

此外,您不能确定用户在请求时是否收到了电子邮件。我喜欢在这些情况下(短信、电子邮件等)使用 202 Accepted,因为它告诉 API 消费者这是一个有效请求,但可能需要一些时间才能完成。