Я пытаюсь реализовать нумерацию страниц для своей конечной точки API Список пользователей. Похоже, чтобы разбить на страницы, нужно получить следующая ссылка через их входящие заголовки из их ответа. При выполнении их конечной точки API List Users через командную строку cUrl или Postman все прекрасно выглядит в заголовке, но проблема заключается в том, что при запуске его из сценария PHP с использованием cUrl или guzzle, Ссылка на сайт HTML-теги удаляются из заголовка, как показано ниже:
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"
Я искал некоторое время и не могу найти решение. Кто-нибудь сталкивался с этой проблемой раньше? Заранее спасибо.
Убедитесь, что вы включаете 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"
Я нашел ваш пост во время поиска чего-то другого, недавно я решил эту проблему, и это мое решение. Все это написано в 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
}
}