带标题的卷曲请求 - 将标题与标题分开

时间:2012-04-30 13:47:51

标签: php

我有一个代码

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);        
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    $ret = curl_exec($ch);
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

现在我想从没有标题的$ ret中提取正文。知道怎么做吗?

3 个答案:

答案 0 :(得分:38)

raina77ow的反应很好。从评论看起来有一些条件会导致“爆炸”不起作用。我找到了一种对我有用的方法,并且认为我会分享。

通过调用curl_getinfo($ ch,CURLINFO_HEADER_SIZE),您可以获得响应头的长度。所以我做了以下事情:

// Original Code
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);        
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$ret = curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Added Code
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($ret, 0, $header_len);
$body = substr($ret, $header_len);

// Back to Original Code
curl_close($ch);

这对我很有用。我希望它可以帮助别人。

答案 1 :(得分:19)

这个怎么样:

list($headers, $content) = explode("\r\n\r\n", $ret, 2);

...哪个应该在$ content变量中为您提供请求的正文?

答案 2 :(得分:2)

this thread ...

中借鉴@Geoffrey出色的答案

提供此线程的其他一些解决方案是而不是正确执行此操作。

  • \r\n\r\n打开或服务器以100代码响应时,CURLOPT_FOLLOWLOCATION上的拆分不可靠。
  • 通过CURLINFO_HEADER_SIZE检测标头的大小并不总是可靠的,尤其是在使用代理或某些相同的重定向方案时。

获取标头的最可靠方法是使用CURLOPT_HEADERFUNCTION然后您可以移除curl_setopt($ch, CURLOPT_HEADER, 1);并且您的身体将清洁而没有标题。

这是一个使用PHP闭包执行此操作的非常简洁的方法。它还将所有标头转换为小写,以便跨服务器和HTTP版本进行一致的处理。

$ch = curl_init();
$headers = [];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Run the following function for each header received
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite.
//       Consider handling that scenario if you need it.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) >= 2)
        $headers[strtolower(trim($header[0]))] = trim($header[1]);
    return $len;
});

$data = curl_exec($ch);
print_r($headers);