我通过REST API公开SQL数据库。
假设我有一个User
模型,使用此模式:
User
- name (string, required)
- age (int, optional)
- friends (list of User, optional)
如果客户POST
sa User
没有age
和friends
字段,则User
将age
存储在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的。
答案 0 :(得分:0)
看起来像是一个实现的东西。如果未指定年龄且未返回任何年龄,则如果未指定任何朋友,则不应返回任何年龄。空阵列就是如何“没有朋友”。由数据库实现。您的客户并不关心数据库,而是关心一致性。除了那些数据库可能产生的数据之外,没有理由返回一个空的朋友数组。
我说要保持一致并保存客户端一些工作,检查数组是否为空。如果没有朋友阵列,那么客户端无需检查,但重要的是,它与其他不存在的属性的返回方式一致。
然而,回答:
不完全是客户发送的内容
由于客户端正在与您的域进行交互,因此很大程度上无关紧要,而不是告诉您的后端以完全保存数据的方式保存数据。如果你的域指定一个用户将拥有一个空的friends数组(如果没有指定),那么返回的是一个空数组,但是由于用户没有年龄但是空白年龄不是因为它是一致的。回。什么是空虚年龄?零?也许年龄应该是必需属性?如果是这样,问题就会消失。