我似乎找不到关于这个主题的任何例子,我想知道如何去做。谁能给我看一个例子或指向一个关于如何使用 Invoke web-request 在 powershell 中进行分页的链接?我面临的挑战是我正在对一次只返回 100 行的服务器进行 API 调用。为了获得更多行,我必须再次调用服务器。我不知道该怎么做。如果有帮助,这里是 Canvas LMS 提供的链接以及我目前拥有的代码。
分页:
分页
默认情况下,返回多个项目的请求将分页到 10 个项目。您可以使用 ?per_page 参数设置自定义的每页数量。可以将 per_page 设置为多大有一个未指定的限制,因此请务必始终检查 Link 标头。
要检索其他页面,应使用返回的 Link 标头。这些链接应被视为不透明。它们将是绝对 url,包括检索所需的当前、下一页、上一页、第一页或最后一页所需的所有参数。一个例外是,如果发送 access_token 参数进行身份验证,它将不会包含在返回的链接中,并且必须重新附加。
链接标题中提供了分页信息:
Link: <https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueA>; rel="current", <https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueB>;> rel="next", <https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueC>;> rel="first", <https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueD>;> rel="last"
可能的 rel 值是:
current - 指向当前结果页面的链接。next - 指向下一页结果的链接。prev - 指向上一页结果的链接。第一 - 链接到结果的第一页。last - 链接到结果的最后一页。只有在相关的情况下才会包含这些内容。例如,结果的第一页将不包含 rel="prev" 链接。如果总计数太昂贵而无法在每个请求上计算,则 rel="last" 也可能被排除在外。
初始产品
$curlly=""
$url_main="https://[instance].instructure.com/api/v1/accounts/1/courses?per_page=1"
$security_token="imhungry"
$header = @{"Authorization"="Bearer "+ $security_token; "rel"="last"}
$curlly=Invoke-WebRequest -Headers $header -Method Get -Uri $url_main
$curlly = ConvertFrom-Json $curlly.Content
foreach($course in $curlly)
{
$course.name
}
$curlly.Count
最终产品
##This is an example on how to use pagination in powershell
$url_main="https://[instance].instructure.com/api/v1/accounts/1/courses?per_page=100"
$security_token="boyimhungry"
$header = @{"Authorization"="Bearer "+ $security_token}
$purlly=Invoke-WebRequest -Headers $header -Method Get -Uri $url_main
$curlly = ConvertFrom-Json $purlly.Content
$url_main = $purlly.Headers.Link.Split(",")[1].Replace("<","").Replace(">","") ## you can get away with just doing one replace("<","") but it looks neater this way
while( !$url_main.Contains("prev"))
{
$purlly=Invoke-WebRequest -Headers $header -Method Get -Uri $url_main
$curlly += ConvertFrom-Json $purlly.Content
$url_main = $purlly.Headers.Link.Split(",")[1].Replace("<","").Replace(">","")
cls
$curlly.Count
$url_main
}
foreach($course in $curlly)
{
$course.name
}
$curlly.Count