1

过去一天我一直在搞乱 CURL,我似乎无法弄清楚如何解析返回数据。我知道我可以编写一个正则表达式来从响应中提取数据,但似乎有一些我可能缺少的功能。这是我想做的事情。

我想对不同的域进行 POST 并取回 3 件事 1. 响应标头 2. 响应数据 3. 会话 cookie

有没有办法可以分别取回这三样东西?现在我只是得到一个带有响应头和响应数据的纯文本响应。我希望能够做类似的事情

$Response = curl_exec($Curl_Connection);
$ResponseData = $Response['Data'];
$ResponseHeader = $Response['Header'];
ResponseCookie = $Response['Cookie'];

curl 提供这样的东西吗?

4

2 回答 2

5

正如我回答的:

请求标头 CURLOPT_HEADER 时未返回任何发布数据。PHP 卷曲

添加:

curl_setopt($Curl_Connection, CURLOPT_HEADER, TRUE);

$Response = curl_exec($Curl_Connection);
$curlHeaderSize=curl_getinfo($ch,CURLINFO_HEADER_SIZE);

$ResponseData = mb_substr($result, $curlHeaderSize);
$ResponseHeader = mb_substr($result, 0, $curlHeaderSize);

preg_match_all('|Set-Cookie: (.*);|U', $ResponseHeader, $content);   
$ResponseCookie = implode(';', $content[1]);
于 2011-07-31T19:20:40.137 回答
3

根据 curl 文档:

/* TRUE to include the header in the output. */
curl_setopt($Curl_Connection, CURLOPT_HEADER, TRUE);

因此标头被添加到 curl_exec 命令的输出中。我一直在吐出这个,我看不出有任何方法可以将标头与响应正文分开检索。当您开始读取压缩输出(压缩、膨胀)时,情况会变得更糟

最重要的是,它是一个大字符串,而不是数组,因此如果您希望标题采用诸如 curl_getinfo 之类的格式,则会返回一个数组。

最简单的方法是这样做:

$backend_output = curl_exec($ch);
list( $backend_response_headers, $backend_response_body) 
      =  explode("\r\n\r\n", $backend_output, 2);

这将把这两个分开,但你最终会得到一个响应头的字符串,而不是一个更有帮助的数组。现在从中制作一个数组并不那么明显,即使使用正则表达式,因为您无法拆分例如像 /(\w)\s:(\w)/ 这样简单的东西,因为 ':' 可能出现在某些字段中. 如果 curl 单独提供标题会非常酷,但就我浏览文档而言,它似乎不存在。

关于您的会话 cookie,我相信您需要为此使用 CURLOPT_COOKIESESSION = true 选项,但我对 cookie 的经验较少,因为我几乎没有专业需要使用它们。祝你好运

更新:如果您缺少 pecl,您可以使用http://php.net/manual/en/function.http-parse-headers.php或用户评论部分中的自定义函数解析标题。

于 2012-10-03T14:24:41.203 回答