2016-06-09 60 views
1

我不能在這個主題上找到任何示例,我想知道如何去做。 任何人都可以告訴我一個例子或指向我一個關於如何在PowerShell中使用Invoke web請求做分頁的鏈接嗎?我面臨的挑戰是我正在對一次只返回100行的服務器進行API調用。爲了獲得更多的行,我必須再次打電話給服務器。我不知道該怎麼做。 如果有幫助,這裏是Canvas LMS提供的鏈接和我迄今爲止的代碼。Invoke-WebRequest Canvas LMS API分頁

Pagination

分頁

請求返回多個項目將通過 默認分頁到10個項目。您可以使用?per_page 參數設置每頁自定義金額。對於每頁可設置多少個頁面有多大的限制是不確定的,因此請務必始終檢查鏈接標題。

要檢索其他頁面,返回的鏈接標頭應使用 。這些鏈接應該被視爲不透明。它們將是絕對的 網址,其中包含檢索所需 當前,下一個,上一個,第一個或最後一個頁面所需的全部參數。有一個例外是 ,如果發送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 =「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 

回答

1

這看起來像一個真正的痛苦。

在每個分頁請求中,您將返回一個Link標題,其中包含一個或多個他們描述的鏈接。

爲了您的目的(對每個結果進行順序讀取),您只需要關注鏈接rel=next鏈接。你會一直打電話給那個,直到沒有rel=next了,這就是你如何知道你在最後一頁。

您不提供rel部分;這不是一個標題。它可以讓你確定使用哪個鏈接,然後按照原樣使用該鏈接。

所以,你需要做的基本概況:

  1. 製作的第一個請求。
  2. 通讀返回的Link標題,並找到與rel=next相對應的標題(如果不存在,則完成)。
  3. 直接向您找到的鏈接發送下一個請求。
  4. 再次解析Link標題,重複。
1

我知道你已經接受了一個答案,但我想我會給我的代碼示例,以防萬一有人需要。這個例子獲得了我們所有Canvas用戶的列表。不是一個可怕的過程 - 大部分工作都是在4線do..while循環中完成的。

$token = "YOUR_ACCESS_TOKEN" 
$headers = @{"Authorization"="Bearer "+$token} 
$allCanvasUsers = New-Object System.Collections.ArrayList @() 
$pageNumber = 1 

Function RequestPageOfUsers($page) { 
    $script:resultsPage = Invoke-WebRequest -Method GET -Headers $headers -Uri "https://$domain/api/v1/accounts/self/users?per_page=100&search_term=P00&page=$page" 
    $usersPage = ConvertFrom-Json $resultsPage.Content 

    foreach ($user in $usersPage) { 
     $script:allCanvasUsers.Add($user) 
    } 
} 

do { 
    RequestPageOfUsers $pageNumber 
    $pageNumber++ 
} while ($resultsPage.Headers.Link.Contains('rel="next"'))