2016-11-03 12 views
0

APIエンドポイントList UsersにOktaのページネゴシエーションを実装しようとしています。ページを貼るには、の次のリンクを受信したヘッダーから返信する必要があります。コマンドラインのcUrlまたはPostmanを使用してList Users APIエンドポイントを実行すると、ヘッダーにすべてが表示されますが、cUrlまたはguzzleを使用してPHPスクリプトから実行すると、リンクのhtmlタグがヘッダーから削除されます。以下に示す:OggaのAPIリストユーザの応答ヘッダから次のリンクをページ付けするにはどうすればよいですか?

HTTP/1.1 200 OK 
Date: Thu, 03 Nov 2016 19:36:34 GMT 
Server: nginx 
Content-Type: application/json;charset=UTF-8 
Vary: Accept-Encoding 
X-Okta-Request-Id: WBuTwqhxlYz3iu5PY1jqHQZZBMU 
X-Rate-Limit-Limit: 1200 
X-Rate-Limit-Remaining: 1198 
X-Rate-Limit-Reset: 1478201841 
Cache-Control: no-cache, no-store 
Pragma: no-cache 
Expires: 0 
Link: ; rel="self" 
Strict-Transport-Security: max-age=315360000 

ヘッダの代わりとして見えるべきである:

HTTP/1.1 200 OK 
Content-Type: application/json 
Link: <https://your-domain.okta.com/api/v1/users?limit=200>; rel="self" 
Link: <https://your-domain.okta.com/api/v1/users? after=00ud4tVDDXYVKPXKVLCO&limit=200>; rel="next" 

Iしばらく検索し解決策を見つけることができません。以前誰かがこの問題に遭遇しましたか?前もって感謝します。

答えて

2

ご要望にAccept: application/jsonヘッダーが含まれていることを確認してください。私の推測では、PHPのcURLまたはGuzzleは、text/plainのような異なるMIMEタイプを使用していると思います。

私は結果を与えない、次のcurlコマンドを使用して問題を再現することができた:私はapplication/jsonAccept:ヘッダーを変更した場合、私はLink:ヘッダを得るか、しかし

curl --verbose \ 
     --header "Authorization: SSWS ${API_KEY}" \ 
     --header "Content-Type: application/json" \ 
     --header "Accept: text/plain" \ 
     "https://${ORG}/api/v1/users?limit=1" 2>&1 | grep 'Link: ' 

curl --verbose \ 
     --header "Authorization: SSWS ${API_KEY}" \ 
     --header "Content-Type: application/json" \ 
     --header "Accept: application/json" \ 
     "https://${ORG}/api/v1/users?limit=1" 2>&1 | grep 'Link: ' 

< Link: <https://example.okta.com/api/v1/users?limit=1>; rel="self" 
< Link: <https://example.okta.com/api/v1/users?after=012a3b456cdefgHijK7l8&limit=1>; rel="next" 
+0

ありがとうございます。私の場合のように、ヘッダーを印刷するためにphpのprint_r()を使用していました。これは何らかの理由でこの関数がヘッダーからリンクの内容を取り除きます。あなたはヘッダーのMIMEタイプについては正解でした。再度、感謝します! – user1370897

0

何か他のものを探している間にあなたの投稿を見つけましたが、私は最近この問題に取り組みました。これが私の解決策です。これらはすべてPowerShellで書かれています。

#Function to automatically get all listings by pagination, this function will use the default Okta Limit parameter. Which is 1000 as the time of this making. 
#Invoke-OktaPagedMethod is based on the _oktaRecGet() function from https://github.com/mbegan/Okta-PSModule/blob/master/Okta.psm1 
function Invoke-OktaPagedMethod { 
    param 
    (
     [string]$Uri, 
     [array]$col, 
     [int]$loopcount = 0 
    ) 

    try { 
     #[System.Net.HttpWebResponse]$response = $request.GetResponse() 
     $OktaResponse = Invoke-WebRequest -Method Get -UseBasicParsing -Uri $Uri -Headers $OktaHeaders -TimeoutSec 300 

     #Build an Hashtable to store the links 
     $link = @{} 
     if ($OktaResponse.Headers.Link) { # Some searches (eg List Users with Search) do not support pagination. 
      foreach ($header in $OktaResponse.Headers.Link.split(",")) { 
       if ($header -match '<(.*)>; rel="(.*)"') { 
        $link[$matches[2]] = $matches[1] 
       } 
      } 
     } 

     $link = @{ 
      next = $link.next 
     } 

     try { 
      $psobj = ConvertFrom-Json -InputObject $OktaResponse.Content 
      $col = $col + $psobj 
     } catch { 
      throw "Json Exception : " + $OktaResponse 
     } 
    } catch { 
     throw $_ 
    } 

    if ($link.next) { 
     $loopcount++ 
     if ($oktaVerbose) { Write-Host "fetching next page $loopcount : " -ForegroundColor Cyan} 
     Invoke-OktaPagedMethod -Uri $link.next -col $col -loopcount $loopcount 
    } else { 
     return $col 
    } 
} 
関連する問題