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

Mic*_*hal 8 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);
Run Code Online (Sandbox Code Playgroud)

现在我想从没有标题的$ ret中提取身体.知道怎么做吗?

小智 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);
Run Code Online (Sandbox Code Playgroud)

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


rai*_*7ow 21

这个怎么样:

list($headers, $content) = explode("\r\n\r\n", $ret, 2);
Run Code Online (Sandbox Code Playgroud)

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

  • 这在HTTP/1.1时失败.存在100个继续标题. (8认同)
  • 您可以使用`curl_setopt($ ch,CURLOPT_HTTPHEADER,array('Expect:'));`删除Continue-Header. (5认同)
  • 当使用CURLOPT_FOLLOWLOCATION并且获取具有301或302重定向的地址时,这也是无效的. (3认同)
  • 这对于 GET 请求来说是可靠的,但对于像 POST 这样的情况,请参阅 natiupiru 的答案。 (2认同)