SQL支持的REST API中的空列表与空列表

时间:2018-03-28 10:59:47

标签: sql list rest nullable

我通过REST API公开SQL数据库。

假设我有一个User模型,使用此模式:

User
- name (string, required)
- age (int, optional)
- friends (list of User, optional)

如果客户POST sa User没有agefriends字段,则Userage存储在SQL数据库中作为null,与任何其他User没有“朋友”关系。

当客户端GET返回用户时,我的API不返回age的值和friends键的空数组。

POST /users/
{"name": "Chuck"}
GET /users/chuck
{"name": "Chuck", "friends": []}

关于返回一个与客户端发送的值不完全相同的值,我感到很奇怪,即使在功能上,它也具有相同的含义。

但我没有看到任何方法来区分数据库中的“无列表”和“空列表”。

这与SQL有关,因为在MongoDB中,文档将以不同的方式存储在“空列表”和“缺失列表”的情况下,因此可以准确地返回发送的内容。

是否有关于此的普遍接受的指南?

我应该放手吗?

我可以在API中将该字段标记为default=[],这样至少客户无法声称他对此感到惊讶。但这看起来像是一种解决方法。

我正在使用Python,SQLAlchemy用于数据库,使用Marshmallow进行API序列化/反序列化,但我不认为这是特定于Python的。

1 个答案:

答案 0 :(得分:0)

看起来像是一个实现的东西。如果未指定年龄且未返回任何年龄,则如果未指定任何朋友,则不应返回任何年龄。空阵列就是如何“没有朋友”。由数据库实现。您的客户并不关心数据库,而是关心一致性。除了那些数据库可能产生的数据之外,没有理由返回一个空的朋友数组。

我说要保持一致并保存客户端一些工作,检查数组是否为空。如果没有朋友阵列,那么客户端无需检查,但重要的是,它与其他不存在的属性的返回方式一致。

然而,回答:

  

不完全是客户发送的内容

由于客户端正在与您的域进行交互,因此很大程度上无关紧要,而不是告诉您的后端以完全保存数据的方式保存数据。如果你的域指定一个用户将拥有一个空的friends数组(如果没有指定),那么返回的是一个空数组,但是由于用户没有年龄但是空白年龄不是因为它是一致的。回。什么是空虚年龄?零?也许年龄应该是必需属性?如果是这样,问题就会消失。