
本文详解 http 请求中自定义 header 与 url 查询参数(get)的本质区别,指出常见混淆误区,并提供 delphi 客户端发送方式及 php 服务端对应的正确接收方案。
在开发中,一个高频误区是:误将 HTTP 请求头(Header)当作 $_GET 变量来访问。例如,你用 TIdHTTP 或 THTTPClient 设置了自定义头 test: text,却在 PHP 中写 $_GET['test'] 判断——这必然失败,因为 $_GET 只解析 URL 查询字符串(query string)中的键值对,而自定义 Header 存储在 $_SERVER 超全局数组中,且需遵循特定命名规范。
| 传递方式 | 客户端示例(Delphi) | PHP 接收方式 | 对应 URL 示例 |
|---|---|---|---|
| GET 参数(查询参数) | IdHttp1.Get('https://example.com?test=text'); | $_GET['test'] → 'text' | https://example.com?test=text |
| 自定义 HTTP Header | IdHttp1.Request.CustomHeaders.AddValue('X-Test', 'text'); | $_SERVER['HTTP_X_TEST'] → 'text' | (URL 不变,仅 Header 携带) |
⚠️ 注意:PHP 将 Header 名自动转换为 HTTP_ 前缀 + 大写 + 下划线格式(连字符 - 和空格均转为 _)。原始 Header X-Test → $_SERVER['HTTP_X_TEST'];My-Custom-Header → $_SERVER['HTTP_MY_CUSTOM_HEADER']。
procedure TForm1.Button1Click(Sender: TObject);
begin
// ✅ 方式1:发送 GET 参数(推荐用于简单传参)
Memo1.Text := IdHttp1.Get('https://example.com?test=text');
// ✅ 方式2:发送自定义 Header(适用于认证、追踪等元信息)
IdHttp1.Request.CustomHeaders.Clear;
IdHttp1.Request.CustomHeaders.AddValue('X-Test', 'text'); // 注意使用标准前缀如 X-
Memo1.Text := IdHttp1.Get('https://example.com');
end;掌握这一区分,可避免大量“参数收不到”的调试陷阱,提升前后端协作效率。