Многостраничный xml Отдых по вызову в powershell

Поэтому вскоре я столкнусь с проблемой, когда мой текущий запрос в API-интерфейсе Rest API Vcloud, который я оставил для автоматизации, не получит все результаты, поскольку он превысит ограничение размера страницы в 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

Теперь, как я должен идти работать над этим... даже в качестве функции.. Я застреваю

Как мне подойти к этому?

Цель состоит в том, чтобы иметь автоматическую проверку, если есть несколько страниц, и получение данных для каждой дополнительной страницы, и выводить все данные ВМЕСТЕ.

Я думаю, мне следует начать с того, что если размер страницы меньше общего... но не уверен в подходе... Я имею в виду, я знаю, что мне нужно сделать вызов REST на КАЖДОЙ странице... но как это сделать формально?

1 ответ

Решение

Оберните звонок в 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" не будет

Другие вопросы по тегам