【问题标题】:Should send null or empty string value via body?应该通过正文发送 null 或空字符串值吗?
【发布时间】:2021-05-10 08:48:34
【问题描述】:

我们应该根据请求发送 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
}

这似乎是一个糟糕的约定

【问题讨论】:

  • 你可以为所欲为。可能只是发送null

标签: node.js mongodb rest restful-url


【解决方案1】:

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

REST 不在乎;也就是说,它告诉我们使用自我描述消息到transfer documents over a network,但它没有告诉我们文档的表示应该是什么。

您想要查看的地方是消息架构定义,特别是设计您的架构,使其可以向后兼容的方式扩展。 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,它允许客户端发现服务器支持资源的哪些补丁表示。

【讨论】:

    【解决方案2】:

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

    phone: '' - 表示用户左侧字段为空

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

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

    【讨论】:

    • 但我总是使用DELETE方法删除用户,如果用户请求DELETE /user/user-id-1,API将删除数据库中userId = user-id-1的用户
    • 在你的情况下你是对的。在我的 api 中,当我删除用户时,我总是添加参数作为确认码。用我的观点更新了答案。
    • 我不想将空值保存到数据库,我将删除该字段,但 UI 上没有删除按钮,用户将删除手机文本框中的值并单击更新按钮。前端发送 { phone: "" } 或 { phone: null } 我不喜欢这样,所以我需要为这种情况下一个新的定义。因为前端总是在文本框为空时发送 null,如果 UI 有很多文本框,API 会收到很多 null 值并且必须进行大量检查
    • 在这种情况下,用户应该PUT { name: 'Name', phone: 'Phone', email: 'Email' }他们,您只需更新整个子文档。然后你照原样更新。
    • ?我不太明白。案例用户删除电话值怎么样?我不想更新整个文档,我只想更新一些真正需要更新的字段
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2020-06-10
      • 2021-01-31
      • 2012-08-28
      • 2013-02-27
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多