Multipage xml powershell 中的 Rest 调用
Multipage xml Rest call in powershell
所以我很快就会遇到一个问题,我在 Vcloud director Rest API 中的当前查询,我留下来自动化,不会得到所有的结果,因为它会超过 100项目页面大小限制。
我可以硬编码来搜索第 2 页,但我实际上只想检查它是否有多个页面,如果有多少页,然后调用所有页面并输出所有页面.我不想每次需要扩展到另一个页面时都必须硬编码。
与以下
$adminvm = Invoke-RestMethod -Uri "https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=10&format=records" -Method Get -Headers $headers
注意第 1 页
我通过解析成 $adminvm.QueryResultRecords
xmlns : http://www.vmware.com/vcloud/v1.5
name : adminVM
page : 1
pageSize : 100
total : 62
href : https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=records
type : application/vnd.vmware.vcloud.query.records+xml
xsi : http://www.w3.org/2001/XMLSchema-instance
schemaLocation : http://www.vmware.com/vcloud/v1.5 http://vcloud.example.com/api/v1.5/schema/master.xsd
Link : {Link, Link}
AdminVMRecord : {TBGRCFS01, Windows Server 2008 R2 Datacenter, sagebe01, LAB-CC-DC01...}
现在,当 $adminvm.QueryResultRecords.pagesize 小于 $adminvm.QueryResultRecords.total 时:
$adminvm.QueryResultRecords.link 来自
rel href
--- ----
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=references
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=idrecords
到
rel href
--- ----
nextPage https://vcloud.example.com/api/query?type=adminVM&page=2&pageSize=100&format=records
lastPage https://vcloud.example.com/api/query?type=adminVM&page=2&pageSize=100&format=records
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=references
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=idrecords
对于那些不熟悉 Vcloud Rest 组织的人来说,所有内容往往都在 $Restcall.QueryRecords.SomethingRecord 中,并且将包含一个 页面 的数据......所以在这种情况下,它将是 $adminvm.QueryResultRecords.AdminVMRecord
现在我应该如何解决这个问题...即使作为一个函数...我卡住了
我该如何处理?
目标是让它自动检查是否有多个页面,并为每个额外的页面获取数据,并将所有数据一起输出。
我想我应该从 if pagesize is less-than total 开始......但不确定方法......我的意思是我知道我必须在每个页面上进行 REST 调用......但是如何公式化地做?
将调用包装在 do{}while()
循环中,然后检查 nextPage
link 是否出现在当前结果中:
# Set the initial URL
$url = "https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=10&format=records"
$results = do {
# Request page
$adminvm = Invoke-RestMethod -Uri $url -Method Get -Headers $headers
# Output results
$adminvm.QueryResultRecords.AdminVMRecord
} while(($url = $adminvm.QueryResultRecords.SelectSingleNode('//link[@rel = "nextPage"]')))
$results
现在包含所有查询的结果。
请注意 SelectSingleNode()
的 XPath 表达式参数区分大小写,因此 @rel = "nextPage"
可以,但 @rel = "NextPage"
不会
所以我很快就会遇到一个问题,我在 Vcloud director Rest API 中的当前查询,我留下来自动化,不会得到所有的结果,因为它会超过 100项目页面大小限制。
我可以硬编码来搜索第 2 页,但我实际上只想检查它是否有多个页面,如果有多少页,然后调用所有页面并输出所有页面.我不想每次需要扩展到另一个页面时都必须硬编码。
与以下
$adminvm = Invoke-RestMethod -Uri "https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=10&format=records" -Method Get -Headers $headers
注意第 1 页
我通过解析成 $adminvm.QueryResultRecords
xmlns : http://www.vmware.com/vcloud/v1.5
name : adminVM
page : 1
pageSize : 100
total : 62
href : https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=records
type : application/vnd.vmware.vcloud.query.records+xml
xsi : http://www.w3.org/2001/XMLSchema-instance
schemaLocation : http://www.vmware.com/vcloud/v1.5 http://vcloud.example.com/api/v1.5/schema/master.xsd
Link : {Link, Link}
AdminVMRecord : {TBGRCFS01, Windows Server 2008 R2 Datacenter, sagebe01, LAB-CC-DC01...}
现在,当 $adminvm.QueryResultRecords.pagesize 小于 $adminvm.QueryResultRecords.total 时:
$adminvm.QueryResultRecords.link 来自
rel href
--- ----
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=references
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=idrecords
到
rel href
--- ----
nextPage https://vcloud.example.com/api/query?type=adminVM&page=2&pageSize=100&format=records
lastPage https://vcloud.example.com/api/query?type=adminVM&page=2&pageSize=100&format=records
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=references
alternate https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=100&format=idrecords
对于那些不熟悉 Vcloud Rest 组织的人来说,所有内容往往都在 $Restcall.QueryRecords.SomethingRecord 中,并且将包含一个 页面 的数据......所以在这种情况下,它将是 $adminvm.QueryResultRecords.AdminVMRecord
现在我应该如何解决这个问题...即使作为一个函数...我卡住了
我该如何处理?
目标是让它自动检查是否有多个页面,并为每个额外的页面获取数据,并将所有数据一起输出。
我想我应该从 if pagesize is less-than total 开始......但不确定方法......我的意思是我知道我必须在每个页面上进行 REST 调用......但是如何公式化地做?
将调用包装在 do{}while()
循环中,然后检查 nextPage
link 是否出现在当前结果中:
# Set the initial URL
$url = "https://vcloud.example.com/api/query?type=adminVM&page=1&pageSize=10&format=records"
$results = do {
# Request page
$adminvm = Invoke-RestMethod -Uri $url -Method Get -Headers $headers
# Output results
$adminvm.QueryResultRecords.AdminVMRecord
} while(($url = $adminvm.QueryResultRecords.SelectSingleNode('//link[@rel = "nextPage"]')))
$results
现在包含所有查询的结果。
请注意 SelectSingleNode()
的 XPath 表达式参数区分大小写,因此 @rel = "nextPage"
可以,但 @rel = "NextPage"
不会