如何在PHP中调用带X-API-Key的指定Curl命令?报错排查
问题分析与解决方案
先看你提供的原始Curl命令:
curl -H "x-api-key: xxxxxxxxxxxxxxxxxxxxxx" "https://api.civicengine.com/office-holders?address=1060+W+Addison+Chicago+IL"
这是一个GET请求,仅通过x-api-key请求头传递认证信息,但你的PHP代码里犯了几个关键错误,直接导致了授权失败:
- 错误启用了
CURLAUTH_BASIC基础认证,该接口根本不需要这种认证方式 - 错误设置了
Authorization: Bearer ...头,接口要求的是x-api-key而非Bearer令牌 - 错误将请求方式设为POST,原始Curl是GET请求,且不需要传递POST参数
- 额外添加了不必要的
$data参数,接口的address参数已经通过URL传递
正确的PHP调用代码
下面是完全对齐原始Curl逻辑的修正代码:
<?php // 你的API Key $apiKey = 'xxxxxxxxxxxxxxxxxxxxx'; // 请求URL,和原始Curl保持一致 $url = 'https://api.civicengine.com/office-holders?address=1060+W+Addison+Chicago+IL'; $ch = curl_init(); // 设置请求目标URL curl_setopt($ch, CURLOPT_URL, $url); // 配置请求头:核心是添加x-api-key,其余为可选的内容协商头 $headers = [ 'x-api-key: ' . $apiKey, 'Accept: application/json', 'Accept-Language: en_US' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 明确指定GET请求(CURL默认就是GET,这行可省略,但写出来更清晰) curl_setopt($ch, CURLOPT_HTTPGET, true); // 禁用SSL验证(如果你的服务器有合法SSL证书,建议删除这行以提升安全性) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 要求返回响应内容而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并处理异常 $response = curl_exec($ch); if(curl_errno($ch)){ echo 'Curl请求错误: ' . curl_error($ch); curl_close($ch); exit; } curl_close($ch); // 解析并输出JSON响应 $result = json_decode($response); print_r($result); ?>
错误原因说明
你收到的签名相关错误,是因为接口误将你发送的Authorization: Bearer头识别成了AWS签名认证格式,但实际上它只需要简单的x-api-key头,所以抛出了不符合预期的授权参数要求。
内容的提问来源于stack exchange,提问作者Parvez Alam
相关产品推荐
相关产品推荐

