API 中的 CreateOrUpdate 职责

CreateOrUpdate responsibility in an API

这是一个通用的设计问题,但在这种情况下责任应该落在哪里?检查记录是否已经存在然后调用 Update 应该是调用者的责任吗?还是应该由 API 来做出决定?

在第一种情况下,问题是调用者负担了业务逻辑,但在第二种情况下,逻辑污染了API并创建了混合行为,违反了关注点分离原则。

实现 CreateOrUpdate 端点会违反一些 REST 原则,但对应用程序开发人员来说可能很方便。您考虑的是远程函数调用,而不是面向资源的 API.

考虑一下:API URL 标识资源。

如果 URL 指向一个集合(即 /customers/),那么创建操作(通常映射到 POST 方法)当然有意义。如果您希望同时更新多个资源,则 Update 函数可能很有意义。 POST 应 return 代码 201 和新创建资源的标识符(即 /customers/1);或者如果由于资源已经存在而导致创建失败,它应该 return 代码 409; 400 如果不满足某些其他约束(如数据验证)。

如果 URL 指向现有资源(即 /customers/id/1),则创建操作没有意义,应导致代码 400。更新通常映射到 PUT 方法(或sometiemes PATCH,如果部分资源更新)并且通常会 return 200 如果更新成功或者 4xx 系列如果没有。

如果您选择创建一个需要 POST 请求的 /CreateOrUpdate 端点,您将必须围绕它设计自己的协议,因为它的行为和 return 值会因情况而异。

@Evert PUT 可用于创建,但仅当您要求客户端使用标识符制定端点 URI 时,即

PUT /users/myusername

问题是:

  1. 客户端必须发现一个可用的,
  2. 如果使用自然标识符,也可能存在更改它的自然原因,这取决于实现可能会出现问题

我的主要观点是避免创建代表动作(功能)的 REST API 端点。而是使用 HTTP 方法对持久资源执行相应的操作。