PHP + cURL,解析header数据
PHP + cURL, parsing header data
总结:
我正在使用 PHP/cURL 从 Vimeo 获取一些 JSON 数据。
这一直工作正常,(尽管他们的 'rate limit' 要求很奇怪),使用以下内容:
$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...
中发回一些需要的数据(当前 rate-limit 和剩余限制..等)
所以我四处搜索并阅读到您需要将其添加到 cURL options/params:
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 数据的其余部分现在 gone/doesnt 不再显示。
即:
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>";
如果我有 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^
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);
CURLOPT_HEADER
导致 http headers 成为 curl_exec 输出的一部分,这意味着您不再只接收 JSON,您是收到 headers + Json,例如
$response
之前:
{"foo":"bar"}
$response
之后:
Header1: value1
header2: value2
{"foo":"bar"}
当您将 after
值直接传递给 json_decode()
时,它会呕吐,因为它 NOT 不再有效 json。您需要从该字符串中删除整个 header 组件,因此它只是普通的 json 字符串。
总结: 我正在使用 PHP/cURL 从 Vimeo 获取一些 JSON 数据。
这一直工作正常,(尽管他们的 'rate limit' 要求很奇怪),使用以下内容:
$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...
中发回一些需要的数据(当前 rate-limit 和剩余限制..等)所以我四处搜索并阅读到您需要将其添加到 cURL options/params:
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 数据的其余部分现在 gone/doesnt 不再显示。
即:
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>";
如果我有 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^
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);
CURLOPT_HEADER
导致 http headers 成为 curl_exec 输出的一部分,这意味着您不再只接收 JSON,您是收到 headers + Json,例如
$response
之前:
{"foo":"bar"}
$response
之后:
Header1: value1
header2: value2
{"foo":"bar"}
当您将 after
值直接传递给 json_decode()
时,它会呕吐,因为它 NOT 不再有效 json。您需要从该字符串中删除整个 header 组件,因此它只是普通的 json 字符串。