使用PHP调用Coinmarketcap API获取数据失败问题排查
解决 "Trying to get property of non-object" 错误
这个报错的核心原因有两个,咱们一步步拆解清楚:
1. API返回格式是数组而非单个对象
CoinMarketCap的v1 /ticker/{coin}/ 接口返回的是包含单个币种对象的数组,不是直接的独立对象。你现在直接用$parsed_json->{'price_usd'}去访问,相当于在数组上调用对象属性,自然会触发"非对象取属性"的错误。
2. 缺少基础错误处理逻辑
如果curl请求失败(比如网络波动、API服务故障)或者返回了无效JSON,json_decode($data)会返回null,这时候去访问null的属性也会抛出同样的错误。
修复后的完整代码
$url = "https://api.coinmarketcap.com/v1/ticker/vertcoin/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 补充超时和SSL验证配置,提升请求稳定性 curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $data = curl_exec($ch); $curl_error = curl_error($ch); curl_close($ch); // 先处理curl请求层面的错误 if ($curl_error) { die("Curl请求失败: " . $curl_error); } // 验证JSON解析是否成功 $parsed_json = json_decode($data); if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败: " . json_last_error_msg()); } // 确认返回数组有效后再取数据 if (is_array($parsed_json) && !empty($parsed_json)) { // 先取数组第一个元素,再访问price_usd属性 $coindata = $parsed_json[0]->price_usd; echo "Vertcoin当前美元价格: " . $coindata; } else { die("未获取到Vertcoin的有效数据"); }
额外提醒
注意CoinMarketCap的v1 API已经被官方弃用,后续可能会出现服务不稳定甚至停止的情况。如果长期使用,建议迁移到他们的v2或v3 API(v3需要申请API密钥才能调用)。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

