PHP + cURL,解析头部数据

标签 php json curl vimeo

摘要: 我正在使用 PHP/cURL 从 Vimeo 获取一些 JSON 数据。

使用以下内容,效果很好(尽管有奇怪的“速率限制”要求):

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => $json_url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => array("authorization: Bearer ".$access_token)
));
$response = curl_exec($curl);
$response_info = curl_getinfo($curl);
$err = curl_error($curl);
curl_close($curl);

当我转换为 JSON 并使用数据输出时,效果很好:

$vimeoJSON = json_decode($response, true);

echo '<h2 class="title">'.$vimeoJSON['name'] . '</h2>';

但是,Vimeo 在 header 响应中发回一些所需的数据(当前速率限制和剩余限制等)...

所以我四处搜索并了解到您需要将其添加到 cURL 选项/参数中:

CURLOPT_HEADER => true,

所以我这样做了:

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => $json_url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => array("authorization: Bearer ".$access_token)
));
$response = curl_exec($curl);
$response_info = curl_getinfo($curl);
$err = curl_error($curl);
curl_close($curl);

并用它来分解信息:

//get response header details
list($headers, $body) = explode("\n\n", $response, 2);
$headers = explode("\n", $headers);
foreach ($headers as $header) {
    list($key, $value) = explode(':', $header, 2);
    $headers[trim($key)] = trim($value);
}

并像这样显示它:

echo '<p>';
echo "Rate Limit: " . $headers['X-RateLimit-Limit'];
echo " / Remaining Limit: " . $headers['X-RateLimit-Remaining'] . '<br>';
echo "Reset Time: " . $headers['X-RateLimit-Reset'] . '<br>';
echo '</p>';

此时,我正在从 Vimeo 获取所需的 header 响应数据..

但其余 JSON 数据现已消失/不再显示。

即:

echo '<h2 class="title">'.$vimeoJSON['name'] . '</h2>';

不再出现了。

如果我注释掉这一行: CURLOPT_HEADER => 正确,

这又工作了..(但是我不再从 Vimeo 获取 header 响应数据。

问题是:

  • 我如何更新我的代码以允许两者?来自 Vimeo 的 header 响应数据..并且仍然能够使用我在整个应用程序中混淆的 $vimeoJSON['xxxx'] 数据?

@泰勒

使用您的代码示例时(我知道在其他地方可以找到)

//temp
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

echo "HEADER SIZE: " . $header_size . "<br><br>";
echo "HEADER: " . $header . "<br><br>";
echo "BODY: <pre>" . $body . "</pre><br><br>";

如果我将详细信息或 header 设置为 true 也没关系..

返回的嵌入代码已损坏?

似乎是用双引号转义了什么的:

^iframe src=\"https://player.vimeo.com/video/171002772?badge=0&autopause=0&player_id=0\" width=\"900\" height=\"450\" frameborder=\"0\" title=\"How to Save A Dying LVAD - Zachary M. Shinar, MD\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe^

对比

^iframe src="https://player.vimeo.com/video/171002772?badge=0&autopause=0&player_id=0" width="900" height="450" frameborder="0" title="How to Save A Dying LVAD - Zachary M. Shinar, MD" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe^

最佳答案

CURLOPT_HEADER 导致http header 成为curl_exec输出的一部分,这意味着您不再只接收JSON,您正在接收 header + Json,例如

$response 之前:

{"foo":"bar"}

$response 之后:

Header1: value1
header2: value2

{"foo":"bar"}

当您将 after 值直接传递给 json_decode() 时,它会呕吐,因为它不再是有效的 json。您需要从该字符串中删除整个 header 组件,因此它又只是普通的 json 字符串。

关于PHP + cURL,解析头部数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771566/

相关文章:

php - curl_getinfo 返回 -1 作为内容长度

php - 试图调用函数 "curl_init"

php - 如何获取mysql中的最后一个同类?

php - 在文件 csv 中导入到表 mysql 中,对于新行,更好地使用\n ,\r 或\r\n?

java - 使用 gson/jackson java API 解析 json 文件

php - json编码的php数组在javascript中返回未定义

php - 使用 javascript 或 php 获取表单字段名称?

php - 当我将 ajax 发布到外部服务器时,我的服务器 php.ini 设置会应用吗?

javascript - 如何删除 html 表的行?

php - Paypal REST api 计费协议(protocol) 搜索交易