PHP使用cURL设置请求头与获取响应头及Body数据

何川
何川
发布时间:2026-10-13 | 2人浏览过
原创

在PHP开发中,使用cURL进行接口调用时,经常需要自定义请求头(如Content-Type、User-Agent)以模拟特定环境或满足服务端验证要求。同时,调试或处理API返回数据时,了解如何正确获取响应头信息以及原始的请求Body体同样关键。

准备工作

cURL是PHP常用的扩展库,用于在脚本中发起网络请求。为了演示头部信息的交互,我们需要准备两个文件:一个是作为客户端的请求脚本,另一个是用于接收请求并打印信息的服务器端脚本。假设环境为本地Apache服务器。

请求方设置自定义头信息

要修改发出的HTTP请求头,可以使用curl_setopt函数设置CURLOPT_HTTPHEADER参数。该方法允许我们完全控制发送的头部字段。

第一步:构建请求头数组

首先解析目标URL,提取路径和查询参数,然后构建一个包含所需HTTP头部的索引数组。注意,HTTP/1.1的标准格式要求第一行包含请求方法、路径和HTTP版本。

<?php
function FormatHeader($url, $myIp = null)
{
    // 解析URL
    $temp = parse_url($url);
    $query = isset($temp['query']) ? $temp['query'] : '';
    $path = isset($temp['path']) ? $temp['path'] : '/';
    
    // 定义HTTP头数组
    $header = array (
        "POST {$path}?{$query} HTTP/1.1",
        "Host: {$temp['host']}",
        "Content-Type: text/xml; charset=utf-8",
        'Accept: */*',
        "Referer: http://{$temp['host']}/",
        'User-Agent: Mozilla/5.0',
        "X-Forwarded-For: {$myIp}",
        // 注意:实际Content-Length需根据body动态计算,此处仅示例结构
        "Connection: Close"
    );
    return $header;
}

$interface = 'http://localhost/test/header2.php';
$header = FormatHeader($interface, '10.1.11.1');

第二步:初始化cURL并应用配置

使用curl_init创建会话,并通过多个curl_setopt设置URL、请求头、超时时间及返回模式。最关键的是设置CURLOPT_RETURNTRANSFER为true,以便将结果保存在变量中而不是直接输出。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $interface);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 应用自定义头信息
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 执行请求
$result = curl_exec($ch);
var_dump($result);

// 关闭会话
curl_close($ch);

被请求方获取头信息与Body数据

在服务端接收请求时,部分自定义的头信息会被自动映射到超全局变量$_SERVER中,但并非所有信息都会以标准形式呈现,且HTTP Body体中的数据不能直接通过$_SERVER获取。

第三步:查看$_SERVER中的头信息

在被请求的脚本(header2.php)中,打印$_SERVER数组可以观察到大部分HTTP头信息。自定义的头通常会有特定的前缀(如HTTP_)或直接作为键存在。

<?php
// header2.php
print_r($_SERVER);
?>

执行上述请求后,在输出中可以看到类似以下的结构,验证了头信息已成功传递:

  • [HTTP_HOST] => localhost
  • [CONTENT_TYPE] => text/xml; charset=utf-8
  • [HTTP_X_FORWARDED_FOR] => 10.1.11.1
  • [HTTP_USER_AGENT] => Mozilla/5.0

第四步:处理自定义Body内容(如XML/JSON)

如果请求中包含了复杂的Body数据(例如XML字符串),它不会出现在$_SERVER中。要读取这些原始输入数据,必须使用PHP提供的伪协议php://input。

<?php
// 读取原始POST Body
$raw_post_data = file_get_contents('php://input', 'r');
echo $raw_post_data;
?>

这是获取非表单提交数据(如RESTful API的JSON或XML body)的标准做法,确保只读取一次输入流。

获取服务器返回的头信息

有时我们需要检查服务端返回的状态码、Server标识或Set-Cookie等响应头信息。这需要通过调整cURL的配置来实现。

第五步:启用响应头输出

默认情况下,CURLOPT_HEADER 设置为 0,表示不返回响应头。将其设为 1 可以让curl_exec返回的结果中包含响应头信息,通常是文本格式,紧跟在头部之后的是Body内容。

cURL_setopt($ch, CURLOPT_HEADER, 1); // 开启返回头
$result_with_header = curl_exec($ch);

此时输出的$result_with_header将包含如下格式的混合数据:

HTTP/1.1 200 OK
Date: Fri, ... GMT
Content-Type: text/html

[Actual Response Body Content]

若只需分离获取响应头而不改变输出行为,也可考虑使用cURL Info功能(如curl_getinfo())或在代码中解析返回值。但对于简单的调试需求,设置CURLOPT_HEADER是最直接的方式。

总结

通过上述步骤,我们掌握了在PHP中使用cURL设置自定义请求头、读取服务端返回头信息以及通过php://input处理原始请求体的完整流程。这些技巧在处理外部API对接、Webhook接收及安全验证时非常实用。以上就是PHP使用cURL设置请求头与获取响应头的详细内容,更多关于PHP网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表