Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从Okta';中的响应头获取下一个链接;s API在分页时列出用户?_Php_Curl_Okta_Paginate_Okta Api - Fatal编程技术网

Php 如何从Okta';中的响应头获取下一个链接;s API在分页时列出用户?

Php 如何从Okta';中的响应头获取下一个链接;s API在分页时列出用户?,php,curl,okta,paginate,okta-api,Php,Curl,Okta,Paginate,Okta Api,我正在尝试为他们的API端点实现Okta的分页。看起来,为了分页,必须从响应中通过传入的标题获得下一个链接。当通过命令行的cUrl或Postman执行他们的List Users API端点时,标题中的一切看起来都很好,但问题是当使用cUrl或guzzle从PHP脚本运行它时,标题中的链接html标记被剥离,如下所示: HTTP/1.1 200 OK Date: Thu, 03 Nov 2016 19:36:34 GMT Server: nginx Content-Type: applicatio

我正在尝试为他们的API端点实现Okta的分页。看起来,为了分页,必须从响应中通过传入的标题获得下一个链接。当通过命令行的cUrl或Postman执行他们的List Users API端点时,标题中的一切看起来都很好,但问题是当使用cUrl或guzzle从PHP脚本运行它时,标题中的链接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"
HTTP/1.1200正常
内容类型:application/json
链接:;rel=“self”
链接:;rel=“下一步”

我找了一会儿,找不到解决办法。以前有人遇到过这个问题吗?提前感谢。

确保在请求中包含
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
,我会得到
链接:
标题:

  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"
curl——冗长\
--标题“授权:SSWS${API\U密钥}”\
--标题“内容类型:应用程序/json”\
--标题“接受:应用程序/json”\
“https://${ORG}/api/v1/users?limit=1”2>&1 | grep'链接:'
确保在请求中包含
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
,我会得到
链接:
标题:

  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"
curl——冗长\
--标题“授权:SSWS${API\U密钥}”\
--标题“内容类型:应用程序/json”\
--标题“接受:应用程序/json”\
“https://${ORG}/api/v1/users?limit=1”2>&1 | grep'链接:'
我在搜索其他内容时找到了你的帖子,我最近解决了这个问题,这是我的解决方案。所有这些都是在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
    }
}
#函数要通过分页自动获取所有列表,此函数将使用默认的Okta Limit参数。制作这张照片的时间是1000。
#Invoke OktaPagedMethod基于https://github.com/mbegan/Okta-PSModule/blob/master/Okta.psm1
函数调用OktaPagedMethod{
param
(
[字符串]$Uri,
[阵列]$col,
[int]$loopcount=0
)
试一试{
#[System.Net.HttpWebResponse]$response=$request.GetResponse()
$OktarResponse=Invoke WebRequest-Method Get-UseBasicParsing-Uri$Uri-Headers$OktaHeaders-TimeoutSec 300
#构建一个哈希表来存储链接
$link=@{}
如果($OktarResponse.Headers.Link){#一些搜索(例如使用搜索列出用户)不支持分页。
foreach($OktaResponse.Headers.Link.split(“,”)中的头){
if($header-match';rel=“(.*)”){
$link[$matches[2]]=$matches[1]
}
}
}
$link=@{
next=$link.next
}
试一试{
$psobj=convertfromJSON-InputObject$OktaResponse.Content
$col=$col+$psobj
}抓住{
抛出“Json异常:”+$OktarResponse
}
}捕获{
扔$_
}
如果($link.next){
$loopcount++
if($oktaVerbose){Write Host“获取下一页$loopcount:“-ForegroundColor Cyan}
调用OktaPagedMethod-Uri$link.next-col$col-loopcount$loopcount
}否则{
返回$col
}
}

我在搜索其他内容时找到了你的帖子,我最近解决了这个问题,这是我的解决方案。所有这些都是在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
    }
}
#函数要通过分页自动获取所有列表,此函数将使用默认的Okta Limit参数。制作这张照片的时间是1000。
#Invoke OktaPagedMethod基于https://github.com/mbegan/Okta-PSModule/blob/master/Okta.psm1
函数调用OktaPagedMethod{
param
(
[字符串]$Uri,
[阵列]$col,
[int]$loopcount=0
)
试一试{
#[System.Net.HttpWebResponse]$response=$request.GetResponse()
$OktarResponse=Invoke WebRequest-Method Get-UseBasicParsing-Uri$Uri-Headers$OktaHeaders-TimeoutSec 300
#构建一个哈希表来存储链接
$link=@{}
如果($OktarResponse.Headers.Link){#一些搜索(例如使用搜索列出用户)不支持分页。
foreach($OktaResponse.Headers.Link.split(“,”)中的头){
if($header-match';rel=“(.*)”){
$link[$matches[2]]=$matches[1]
}
}
}
$link=@{
next=$link.next
}
试一试{
$psobj=convertfromJSON-InputObject$OktaResponse.Content
$col=$col+$psobj
}抓住{
抛出“Json异常:”+$OktarResponse
}
}捕获{
扔$_
}
如果($link.next){
$loopcount++
if($oktaVerbose){Write Host“获取下一页$loopcount:“-ForegroundColor Cyan}
调用OktaPagedMethod-Uri$link.next-col$col-loopcount$loopcount
}否则{
返回$col
}
}

谢谢您的回复。在我的例子中,我们使用php的print_r()打印标题,出于某种原因,该函数会从标题中删除链接的内容