Многостраничный 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"
не будет