ruby 中的 httpparty 响应解释
httparty response interpretation in ruby
我有一项服务 returns(采用 XML 格式)网络列表。该列表可以由 1 个网络或 2 个以上网络组成。
例如,这是从有 1 个网络的 REST 客户端返回的内容
<Vdc status="1" name="VDC1" id="urn:vcloud:vdc:c66c192a-b58e-468c-bca8-4bfd5657f2ff" href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/vdc/c66c192a-b58e-468c-bca8-4bfd5657f2ff" type="application/vnd.vmware.vcloud.vdc+xml" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://uk-slough-1-6.vchs.vmware.com/api/compute/api/v1.5/schema/master.xsd">
<AvailableNetworks>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/4c5703e5-4365-4408-8f8e-12ec3bfc716f" name="default-routed-network" type="application/vnd.vmware.vcloud.network+xml"/>
</AvailableNetworks>
</Vdc>
这是当有 2 个网络时返回的内容:
<Vdc status="1" name="massimo" id="urn:vcloud:vdc:ec16bc23-659d-48b8-af7d-9dda6584122e" href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/vdc/ec16bc23-659d-48b8-af7d-9dda6584122e" type="application/vnd.vmware.vcloud.vdc+xml" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://uk-slough-1-6.vchs.vmware.com/api/compute/api/v1.5/schema/master.xsd">
<AvailableNetworks>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/762cc1c7-d9cc-4eb8-9dfd-17bbc04ca607" name="default-routed-network" type="application/vnd.vmware.vcloud.network+xml"/>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/8cf5b475-901b-4bed-9506-b394ed2505c2" name="massimo-network" type="application/vnd.vmware.vcloud.network+xml"/>
</AvailableNetworks>
</Vdc>
如果我使用 httparty 查询服务,这就是当有 1 个网络时我在响应中得到的内容:
"AvailableNetworks" => {
"Network" => {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/4c5703e5-4365-4408-8f8e-12ec3bfc716f",
"name" => "default-routed-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
}
},
这是我在有 2 个网络时得到的结果:
"AvailableNetworks" => {
"Network" => [
[0] {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/762cc1c7-d9cc-4eb8-9dfd-17bbc04ca607",
"name" => "default-routed-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
},
[1] {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/8cf5b475-901b-4bed-9506-b394ed2505c2",
"name" => "massimo-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
}
]
},
这使得管理响应变得非常困难。目前我所做的如下:我 运行 检查是否 response["Vdc"]["Networks"]
是一个数组,如果是我迭代它的长度并将其所有元素视为独立的哈希项。如果它不是一个数组,我将 response["Vdc"]["Networks"]
当作一个散列来处理。
有没有更好的方法来处理这个问题并且避免检查?理想情况下,我希望看到 response["Vdc"]["Networks"]
始终是一个数组(如果有 1 个网络,我希望看到一个包含 1 个元素的数组)。
谢谢!
因为 httparty 及其底层的 XML 解析器不理解 API 模式,它将被简单地创建为键值对。此代码将强制元素成为数组(如果尚未存在)。
result["Vdc"]["AvailableNetworks"]["Network"] = [result["Vdc"]["AvailableNetworks"]["Network"]] unless result["Vdc"]["AvailableNetworks"]["Network"].is_a? Array
我有一项服务 returns(采用 XML 格式)网络列表。该列表可以由 1 个网络或 2 个以上网络组成。
例如,这是从有 1 个网络的 REST 客户端返回的内容
<Vdc status="1" name="VDC1" id="urn:vcloud:vdc:c66c192a-b58e-468c-bca8-4bfd5657f2ff" href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/vdc/c66c192a-b58e-468c-bca8-4bfd5657f2ff" type="application/vnd.vmware.vcloud.vdc+xml" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://uk-slough-1-6.vchs.vmware.com/api/compute/api/v1.5/schema/master.xsd">
<AvailableNetworks>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/4c5703e5-4365-4408-8f8e-12ec3bfc716f" name="default-routed-network" type="application/vnd.vmware.vcloud.network+xml"/>
</AvailableNetworks>
</Vdc>
这是当有 2 个网络时返回的内容:
<Vdc status="1" name="massimo" id="urn:vcloud:vdc:ec16bc23-659d-48b8-af7d-9dda6584122e" href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/vdc/ec16bc23-659d-48b8-af7d-9dda6584122e" type="application/vnd.vmware.vcloud.vdc+xml" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://uk-slough-1-6.vchs.vmware.com/api/compute/api/v1.5/schema/master.xsd">
<AvailableNetworks>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/762cc1c7-d9cc-4eb8-9dfd-17bbc04ca607" name="default-routed-network" type="application/vnd.vmware.vcloud.network+xml"/>
<Network href= "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/8cf5b475-901b-4bed-9506-b394ed2505c2" name="massimo-network" type="application/vnd.vmware.vcloud.network+xml"/>
</AvailableNetworks>
</Vdc>
如果我使用 httparty 查询服务,这就是当有 1 个网络时我在响应中得到的内容:
"AvailableNetworks" => {
"Network" => {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/4c5703e5-4365-4408-8f8e-12ec3bfc716f",
"name" => "default-routed-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
}
},
这是我在有 2 个网络时得到的结果:
"AvailableNetworks" => {
"Network" => [
[0] {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/762cc1c7-d9cc-4eb8-9dfd-17bbc04ca607",
"name" => "default-routed-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
},
[1] {
"href" => "https://uk-slough-1-6.vchs.vmware.com/api/compute/api/network/8cf5b475-901b-4bed-9506-b394ed2505c2",
"name" => "massimo-network",
"type" => "application/vnd.vmware.vcloud.network+xml"
}
]
},
这使得管理响应变得非常困难。目前我所做的如下:我 运行 检查是否 response["Vdc"]["Networks"]
是一个数组,如果是我迭代它的长度并将其所有元素视为独立的哈希项。如果它不是一个数组,我将 response["Vdc"]["Networks"]
当作一个散列来处理。
有没有更好的方法来处理这个问题并且避免检查?理想情况下,我希望看到 response["Vdc"]["Networks"]
始终是一个数组(如果有 1 个网络,我希望看到一个包含 1 个元素的数组)。
谢谢!
因为 httparty 及其底层的 XML 解析器不理解 API 模式,它将被简单地创建为键值对。此代码将强制元素成为数组(如果尚未存在)。
result["Vdc"]["AvailableNetworks"]["Network"] = [result["Vdc"]["AvailableNetworks"]["Network"]] unless result["Vdc"]["AvailableNetworks"]["Network"].is_a? Array