1

所以我很快就会面临一个问题,我在 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 调用......但是如何公式化地做到这一点?

4

1 回答 1

3

将调用包装在一个do{}while()循环中,然后检查nextPage当前结果中是否存在链接:

# 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现在包含所有查询的结果。

请注意,XPath 表达式参数SelectSingleNode()是区分大小写的,所以@rel = "nextPage"会起作用,但@rel = "NextPage"不会

于 2017-02-27T21:04:28.863 回答