PHP 7.3 调用 Claude API 报“请求头格式错误”的根本原因是 Anthropic 对请求头字段名、大小写、空格及值格式有严格要求,必须精确设置 Authorization(Bearer + 密钥,冒号后仅一空格)、anthropic-version(硬编码为 2023-06-01)和 Content-Type(仅 application/json),并用 CURLOPT_HTTPHEADER 数组传入,同时确保 POSTFIELDS 为 json_encode 后的字符串。

PHP 7.3 调用 Claude API 报“请求头格式错误”,核心问题不是 PHP 版本兼容性,而是 Anthropic 对请求头字段名、值格式、必填项有硬性要求,稍有偏差(比如大小写、空格、缺失头)就会返回 400 Bad Request 或 401 Unauthorized。下面直接说怎么改。
必须设置的三个请求头及其精确写法
Anthropic 官方接口不接受简化或别名写法,以下三项缺一不可,且大小写、拼写、空格都必须严格匹配:
-
Authorization:值为
Bearer sk-ant-api03-xxx(注意:Bearer首字母大写,:后**只跟一个空格**,密钥前不能加引号,也不能有多余换行或空格) -
anthropic-version:值为
2023-06-01(这是当前稳定版,不是动态获取的,必须硬编码) -
Content-Type:值为
application/json(不能是application/json; charset=utf-8,也不能漏掉)
cURL 设置请求头的正确 PHP 写法(PHP 7.3 兼容)
很多失败源于用 curl_setopt($ch, CURLOPT_HEADER, true) 或手动拼接 header 字符串出错。应使用 CURLOPT_HTTPHEADER 数组传入:
$headers = [
'Authorization: Bearer ' . trim($api_key),
'anthropic-version: 2023-06-01',
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
关键点:
– trim($api_key) 防止密钥前后混入空格或 BOM;
– 不要加 User-Agent、X-Forwarded-For 等自定义头,会触发校验失败;
– 不要用 curl_setopt($ch, CURLOPT_HEADER, ...) 模拟头,它不生效。
Content-Type 和请求体必须同步匹配
仅设对头还不够——如果 Content-Type 是 application/json,但 CURLOPT_POSTFIELDS 传的是 PHP 数组,cURL 会自动转成 application/x-www-form-urlencoded,导致服务端解析失败。
立即学习“PHP免费学习笔记(深入)”;
务必这样做:
- 用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)生成字符串; - 确认
$data中messages是非空数组,每个元素含role(只能是"user"或"assistant")和content(字符串); - 传给 cURL 的是字符串,不是数组:
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_string)。
快速验证是否修好
在代码中临时加一行输出,检查实际发出的头是否合规:
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // ... 执行请求后 $headers_sent = curl_getinfo($ch, CURLINFO_HEADER_OUT); echo "Sent headers:\n" . $headers_sent;
看到类似以下内容才算正确:
POST /v1/messages HTTP/2 Host: api.anthropic.com Authorization: Bearer sk-ant-api03-... anthropic-version: 2023-06-01 Content-Type: application/json



















