【问题标题】:PHP + cURL, parsing header dataPHP + cURL,解析头数据
【发布时间】:2016-12-10 19:49:54
【问题描述】:

总结: 我正在使用 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 RESPONSE 中发回一些需要的数据(当前速率限制和剩余限制..等)...

所以我四处搜索并了解到您需要将其添加到 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 获取所需的标头响应数据..

但 JSON 数据的其余部分现在已经消失/不再显示。

即:

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

确实出现了。

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

这项工作又来了..(但是我不再从 Vimeo 获得我的标头响应数据了。

问题是:

  • 如何更新我的代码以允许两者?来自 Vimeo 的标头响应数据.. 并且仍然能够使用我在整个应用程序中使用的 $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>";

如果我将verbose或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^

【问题讨论】:

    标签: php json curl vimeo


    【解决方案1】:

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

    $response 之前:

    {"foo":"bar"}
    

    $response 之后:

    Header1: value1
    header2: value2
    
    {"foo":"bar"}
    

    当您将 after 值直接传递给 json_decode() 时,它会出错,因为它不再是 NOT 有效的 json。您需要从该字符串中撕下整个标头组件,因此它再次只是普通的 json 字符串。

    【讨论】:

    • 谢谢.. 这很有意义.. 但我怎样才能将它们分开呢?有内置的方法吗?
    • 根据定义,http headers 与 body 之间用一个空行分隔。所以...在空白行上拆分,之后的所有内容都应该只是正文。
    • 啊..所以只需手动解析/分离(呃!)抱歉那里很密集!我(无论出于何种原因)认为有一些内置的 CURL/OPT 方法可以分离。我会试一试。 (接受的答案)也许把它放在你的完整答案中,让其他人(可能也有脑子放屁)看到它!
    • 是的,如果有一个 curl_get_headers() 调用将标题与正文分开,那就太好了,但是......唉。
    【解决方案2】:

    CURLOPT_VERBOSE 派上用场:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    
    $response = curl_exec($ch);
    
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);
    

    【讨论】:

    • 你能详细说明一下吗?派上用场...如何? (我不清楚它的用途.. 也不清楚它在您的示例中如何用于解决我的问题?)
    • *更新:当我使用上面的示例时,特别是 $body var.. 当我显示 $body 中保存的数据时.. iframe/embed 代码不起作用?不确定这对从 Vimeo 返回的数据有什么影响?但 iframe 代码不再加载视频/播放器。我在原始帖子中发布了更新的代码。
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多