AWS为什么使用{“ Key”:key,“ Value”:val}语法?

时间:2019-11-30 01:37:36

标签: amazon-web-services boto3

(在Python和Java中)我习惯查看定义为{键:值}的字典/哈希图

AWS使用格式{“ Key”:key,“ Value”:val}

这种方法来自哪里?它增加了复杂性,从这种复杂性中可以获得好处吗?

编辑:一个示例是tags的格式:

make_object_t<char>

2 个答案:

答案 0 :(得分:1)

一种可能性:AWS倾向于针对不同情况在线路上使用相同格式的数据结构,以保持一致性,并通过减少可变性来降低整体系统复杂性。常见的例子是S3事件通知和Lambda @ Edge触发器,其中事件数据结构(在此处显示为{ ... })不必要地包装在具有一个键的外部对象和具有一个{{1 }}即使在这些情况下,根据定义,{"Records": [{ ... }]}数组也永远不能有一个以上的内部对象。他们这样做是为了保持一致性。

另一个可能的解释:SDK用于与服务通信的低级API使用XML¹,这种结构更有意义。

根据EC2 API参考DescribeTags action,以下是示例响应:

Records

它是具有多个属性的对象的数组。并非总是如此,但这使我们回到了上面的“一致性”参数。

使用它通常很尴尬,并且字典看起来似乎更简单,但是SDK似乎只是保留了用于网络的基本数据格式,并且进行了最小的转换,并且该格式已被很多年前采用在以XML为中心的世界中。

另一种可能性:可以看出,这里还有多个候选关键字,可以使用嵌套的字典结构:

<tagSet>
  <item>
     <resourceId>ami-1a2b3c4d</resourceId>
     <resourceType>image</resourceType>
     <key>webserver</key>
     <value/>
  </item>
  <item>
     <resourceId>ami-1a2b3c4d</resourceId>
     <resourceType>image</resourceType>
     <key>stack</key>
     <value>Production</value>
  </item>
  ...
</tagSet>

此结构不适合响应分页。许多API操作都会返回有限的结果集和延续令牌。

这种“改进”的嵌套结构也很难扫描所有“键”等于“堆栈”的标签,因为您必须在树上上下移动。


¹XML ...也有例外,并且没有记录在案的事实是,许多XML服务API秘密地支持JSON,其中一些甚至还通过使用HTTP请求来表示您的意图,从而支持以XML发送请求和以JSON接收响应。标头...但是在在线上进行JSON交互的情况下,也有同样的证据表明它们似乎是在服务端将XML转换为JSON,保留结构,或者对两种格式使用相同的本机结构,这将在不考虑序列化的情况下使服务交互相同是很有意义的。

答案 1 :(得分:0)

该方法的一个好处是您不需要预先知道键,因此您可以更加灵活/模块化,从而允许第三方添加键和值。