Как я могу получить следующую ссылку из заголовка ответа в списке пользователей Okta API при разбивке на страницы?

Я пытаюсь реализовать нумерацию страниц Okta для конечной точки API Список пользователей. Похоже, что для разбивки на страницы нужно получить следующую ссылку через их входящие заголовки из их ответа. При выполнении конечной точки List Users API через командную строку cUrl или Postman все отлично выглядит в заголовке, но проблема заключается в том, что при запуске из PHP-скрипта с использованием cUrl или guzzle теги html Link вырезано из заголовка, как показано ниже:

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"

Я искал некоторое время и не могу найти решение. Кто-нибудь сталкивался с этой проблемой раньше? Заранее спасибо.


person user1370897    schedule 03.11.2016    source источник


Ответы (2)


Убедитесь, что вы включаете заголовок Accept: application/json в свои запросы. Я предполагаю, что PHP cURL или Guzzle используют другой тип MIME, например text/plain.

Мне удалось воспроизвести вашу проблему с помощью следующей команды curl, которая не дает никаких результатов:

 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: '

Однако, если я изменю заголовок Accept: на application/json, я получу заголовок 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"
person Joël Franusic    schedule 03.11.2016
comment
Спасибо за ваш ответ. Похоже, что в моем случае мы использовали php print_r() для печати заголовка, по какой-то причине эта функция удаляет содержимое ссылки из заголовка. Однако вы были правы насчет типа MIME в заголовке. Спасибо еще раз! - person user1370897; 04.11.2016

Я нашел ваш пост, когда искал что-то еще, недавно я решил эту проблему, и это мое решение. Все это написано в 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
    }
}
person Stephen Brile    schedule 15.11.2016