2017-03-06 10 views
2

これまでに必要だったことを得るために、かなり新しいAPIを使い、かなり基本的なクエリを実行しただけです。残りのページからの結果の取得API:ベストプラクティス

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

はその後のすべてのデバイスを照会し、私は、オフに行くと、その変数で物事を行うことができますので、変数にそれらの結果を割り当てる:残りの部分を使用するすべてのデバイスを引き出す新しいPowerShellスクリプトを書く

後で私のスクリプト全体でさまざまなポイントで:

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

あり千10以上の結果は、と私は何をしたいすべての返されたページにわたって結果を検索できるようです。

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

この悪い習慣は、次のとおりです。

は、これまでのところ私は、私は1つのページですべての結果を得るために、このような何かを行うことができて働いてきましたか?

上記のようにしないと、これを達成するための効率的またはプログラム的な方法がありますか?

私が使用しているRest APIの種類は実際はわかりませんが、JiraやConfluenceとは統合されていません。

答えて

1

自分で開発したAPIを開発していますか?

を編集する:あなたのタグでWordPress APIを呼び出していることがわかりました。 WordPress offers pagination linksであり、カスタムヘッダーを介して有用なページ番号情報を提供します。

通常、REST APIは、クエリパラメータ(例: "offset"および "max")を通じてリソースのリストを返すときにページ分割をサポートします。 offsetパラメータはスキップする必要がある結果の数を示し、max(またはあなたの場合はページング)はフェッチする結果の最大値を決定します。

たとえば、http://myapi.com/persons?_offset=0&_max=20は、リストの最初の20人を表します。 HATEOASの制約の中で、クライアントが "前"、 "最初"、 "次"、および "最後"の関係(で標準化されている)を使用してページをナビゲートする方法を知るようにHTTPリンク応答ヘッダーを提供することが推奨されます)。次の応答で

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の結果を一度に取得するのではなく、検索のインデックスを作成してサーバーに不必要なプレッシャーをかける。しかし、あなたのユースケースを知らないと、あなたに適切な助言を与えることは困難です。私が見

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

を:

+0

ご返信いただき、ありがとうございました。 いいえ、それは既にGoogleの組織に存在していました。 このようなナビゲーションリンクをサポートしているように見えます(適合する標準的な方法などを除外します): PS C:\ windows \ system32> $ devicespagetest |私は起動-RESTMethodでループを実装するために見ていきますGM 名前 ---- カウント NextUrl ページ がPageSize PreviousUrl – 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) 

を私が期待しているもの。

これはあなたが話している種類のループですか?

関連する問題