首页 > 解决方案 > 应该通过正文发送 null 或空字符串值吗?

问题描述

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

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

前任:

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

在数据库中:

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

现在,使用想要删除他们的电话号码我们应该定义如下:

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

似乎这是一个糟糕的约定

标签: node.jsmongodbrestrestful-url

解决方案


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

REST不在乎;也就是说,它告诉我们使用自描述消息通过网络传输文档,但它没有告诉我们文档的表示应该是什么。

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


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

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

{
  name: "Alex",
  phone: null
}

如果您的架构以这样一种方式定义,即该phone字段是可选的,并且 optional 和 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规范包括Allow-Patch,它允许客户端发现服务器支持资源的哪些补丁表示。


推荐阅读