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" 不会