2017-03-06 111 views
2

對休息API來說相當新穎,並且只做了一些相當基本的查詢以獲得我目前需要的內容。從靜止頁面獲取頁面結果API:最佳實踐

寫的是翻出所有使用其他的設備的一個新的PowerShell腳本:

$url = "https://my-site.com/internal/api" 

然後查詢所有設備,並給一個變量賦值的結果,所以我就可以去,並且做的事情與該變量後來在我的整個腳本的不同點:

$devices = Invoke-RestMethod -uri "$url/devices" -UseDefaultCredentials -Method Get -ContentType "application/json" 

有超過一萬的結果,我想要做的是能在所有返回的頁面搜索的結果。

到目前爲止,我已經工作了,我可以做這樣的事情讓一個頁面中的所有結果:

$devicespagetest = Invoke-RestMethod -uri "$url/devices?pagesize=99999" -UseDefaultCredentials -Method Get -ContentType "application/json" 

這是不好的做法?

是否有更高效或程序化的方式來實現這一點,而不是像我上面那樣做?

我真的不確定我們使用了多少Rest API,但我知道我們不會將它與Jira或Confluence整合。

回答

1

您正在調用自己開發的API嗎?

編輯:剛剛看到您在標籤中調用WordPress API。 WordPress offers pagination links,並通過自定義標題提供有用的分頁信息。

通常,REST API在通過查詢參數(例如:「offset」和「max」)返回資源列表時提供分頁支持。偏移量參數指示應跳過多少結果,並且max(或您的案例中的頁面大小)確定要獲取的結果的最大值。

例如,http://myapi.com/persons?_offset=0&_max=20代表您的列表中的前20個人。在HATEOAS限制的情況下,建議提供HTTP鏈接響應標頭,以便客戶端知道如何使用「上一個」,「第一個」,「下一個」和「最後」關係(在RFC 5988中標準化)。

例如:

GET /persons?_offset=30&_max=10 HTTP/1.1 
Host: myapi.com 
Accept: application/json 

結果如下回應:

HTTP/1.1 200 OK 
Content-Type: application/json 
Content-Length: 934 
Link: <http://myapi.com/persons?_offset=0&_max=10>; rel="first" 
Link: <http://myapi.com/persons?_offset=20&_max=10>; rel="previous" 
Link: <http://myapi.com/persons?_offset=40&_max=10>; rel="next" 
{body} 

爲了保護服務器的客戶端請求整個列表資源(即沒有指定分頁參數)時,建議採用以下方法。當客戶端請求列表資源時(例如http://myapi.com/persons),服務器將客戶端重定向到第一個X(例如10個)項目。

相應HTTP會話如下所示:下面的響應

GET /persons HTTP/1.1 
Host: myapi.com 
Accept: application/json 

結果:

HTTP/1.1 303 See Other 
Location: http://myapi.com/persons?_offset=0&_max=10 

接着,客戶端遵循重定向:

GET /persons?_offset=0&_max=10 HTTP/1.1 
Host: myapi.com 
Accept: application/json 

這導致以下回應:

HTTP/1.1 200 OK 
Content-Type: application/json 
Content-Length: 850 
Link: <http://myapi.com/persons?_offset=40&_max=10>; rel="next" 
Link: <http://myapi.com/persons?_offset=120&_max=10>; rel="last" 
{body} 

但是,請注意,然而,重定向可能是您需要CORS(Cross Origin Resource Sharing)的環境中的問題的原因。在這種情況下,由GET /人檢索的部分列表的表示可以簡單地指示檢索了多少人以及總共有多少人(可選)。

如果您的API提供了這樣的導航鏈接,那麼最好使用它們並實現與Invoke-RESTMethod的循環併爲您的搜索建立索引,而不是一次獲取10000個結果,這將給您的服務器帶來不必要的壓力。但是不知道你的用例,很難給你一個適當的建議。

+0

感謝您的回覆和建議David。 不是我不,它已經存在於我們的組織中。 看起來它確實支持這樣的導航鏈接(刪除標準方法等以適合): PS C:\ windows \ system32> $ devicespagetest |克 名稱 ---- 計數 NextUrl 頁面 每頁 PreviousUrl 我會期待實現與調用,RESTMethod循環 – J1raya

0

感謝大衛

基礎上得到一個previousurl和nexturl價值,我已經把下面一起來:

$Devurl = "https://my-site.com/internal/api" 
$restResults = Invoke-RestMethod -uri "$Devurl/$device" -UseDefaultCredentials -Method Get -ContentType "application/json" 

$resultpages = $restResults.Pages 
$incpages = '' 
$testarray = @() 

Do { 
    [int]$incpages += 1 
    $url = ($restResults.nexturl) -replace 'page=1',"page=$incpages" 
    $url 
    $getresults = Invoke-RestMethod -uri $url -UseDefaultCredentials -Method Get -ContentType "application/json" 
    $testarray += $getresults.Models 
    $resultpages -= 1 
    } while ($resultpages -gt 0) 

如果我再篩選結果:

$testarray | where {$_.os -like '*windows*'} | select hostname,os 

我見我期望的。

這是你說的那種循環嗎?

相關問題