node.js - 应该通过正文发送 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
}
似乎这是一个糟糕的约定
解决方案
我们应该根据请求发送 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,它允许客户端发现服务器支持资源的哪些补丁表示。
推荐阅读
- azure - 诊断登录
- rstudio - rstudio块没有出现在创建它们的块之后
- python - 结合检测器和描述符进行特征匹配
- php - PHP - Laravel - 基于多个表单输入构建请求
- android - Room - 数据库 '/data/.../db' 的连接池在 X 秒内无法授予与标志为 0x2 的线程的连接
- angular - 无法使用 angular2+ 在同一页面中显示不同的视图
- javascript - 单击时禁用标记
- python - Django FileField 不保存
- node.js - NodeJS os.networkInterfaces() 在 Browserify 包中返回 [Object object]
- sql - SQL 复制数据库