应该通过正文发送 null 或空字符串值吗?

Should send null or empty string value via body?

我们应该根据请求发送 null 或空字符串值吗?

我的意思是我们有一个可选值,它目前有一个值。如果用户想要删除该可选字段的值,API 应该理解 null 或 empty 是删除值吗?

例如:

{
  name: { type: String, required: true },
  phone: { type: String, required: false }
}

在数据库中:

{
  name: "Alex",
  phone: "012-333.222"
}

现在,用户想删除他们的 phone 号码 我们应该定义如下:

PUT /users/user-id-1
{
  phone: null
}

这似乎是一个糟糕的约定

虽然在前端,通常这取决于是否使用删除按钮,或者,他们只是将字段留空

phone: '' - 表示用户将字段留空

phone: null - 表示用户单击删除字段按钮。您决定是删除该字段,还是只将文档字段设置为空。

我通常会删除该字段,因为它现在没用了。

如果您只想更新文档中的一个 属性 您可以使用 PATCH 方法而不是 PUT 方法,您的代码应该如下所示:

PATCH /users/user-id-1
{
     phone: ""
}

Should we send a null or empty string value on request ?

REST doesn't care; which is to say that it tells us to use self descriptive messages to transfer documents over a network,但它并没有告诉我们文档的表示应该是什么。

您要查看的是消息模式定义,特别是设计您的模式,使其可以以向后兼容的方式扩展。 XML 社区花了很多时间探索这些想法; Orchard 2004 可能是一个很好的起点。


在 HTTP 中,描述资源更改的基本机制是使用带有新表示副本的 PUT 命令。所以一个请求可能看起来像:

PUT /users/user-id-1
Content-Type: application/json

{
  name: "Alex",
  phone: null
}

如果您的模式定义为 phone 字段是可选的,并且可选和 null 是等效的(与其他一些隐含值相反),那么您可以等效地使用:

PUT /users/user-id-1
Content-Type: application/json

{
  name: "Alex"
}

在表示非常大而您所做的更改很小的情况下,您可能希望支持 PATCH。

PATCH /users/user-id-1
Content-Type: application/merge-patch+json

{
  phone: null
}

请注意,HTTP PATCH specification includes the Allow-Patch 允许客户端发现服务器支持资源的哪些补丁表示。