首页 >后端开发 >php教程 >如何在单个 PHP cURL 请求中高效检索响应标头和正文?

如何在单个 PHP cURL 请求中高效检索响应标头和正文?

DDD
DDD原创
2024-12-16 07:36:13389浏览

How Can I Efficiently Retrieve Both Response Headers and Body in a Single PHP cURL Request?

在单个 PHP cURL 请求中检索响应标头和正文

PHP 的 cURL 库提供了执行 HTTP 请求的能力,使其具有多种用途数据获取和通信任务。然而,使用 cURL 时遇到的一个常见挑战是需要在单个请求中检索响应标头和正文。

默认情况下,将 CURLOPT_HEADER 设置为 true 会返回响应中组合的标头和正文,这需要进一步解析以提取各个组件。为了更有效和安全的方法,可以采用另一种方法:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

// Execute the request
$response = curl_exec($ch);

// Extract header and body
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

此方法使用 CURLINFO_HEADER_SIZE 信息将标头与正文分开。请注意,在处理代理服务器或某些类型的重定向时,此方法可能有限制。在这种情况下,请考虑使用以下解决方案来提高可靠性:

function get_headers_body($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    // Execute the request and get headers only
    $headers = curl_exec($ch);

    // Close the original handle
    curl_close($ch);

    // Set the necessary header information to a new handle
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

    foreach (explode("\n", $headers) as $header) {
        // Remove set-cookie headers
        if (stripos($header, 'set-cookie') !== false) {
            continue;
        }
        // Add it to the request
        curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    }

    // Execute the request and get the body only
    $body = curl_exec($ch);

    // Close the handle
    curl_close($ch);

    return array(
        'headers' => $headers,
        'body' => $body
    );
}

此解决方案可以更好地控制标头检索过程,确保结果更可靠。

以上是如何在单个 PHP cURL 请求中高效检索响应标头和正文?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn