使用PHP调用NCDC RESTful Web Service获取数据集失败求助
解决NCDC API请求失败的问题
看起来你在调用NCDC的API时踩了几个RESTful API使用的常见坑,我帮你梳理问题并给出修正后的方案:
问题分析
你的代码里有几个关键错误导致请求无结果:
- 请求方法错误:获取数据集列表是查询类操作,NCDC的这个接口需要用
GET请求,而非POST。 - Token传递方式错误:NCDC API要求将token放在HTTP请求头的
token字段中,不是作为POST表单数据提交。 - HTTP头设置错误:你设置了
Content-type: application/json和错误的Content-length,但实际既没有发送JSON数据,GET请求也不需要这些头信息。 - JSON解析后的访问错误:你用
json_decode($curl_response, TRUE)得到的是关联数组,却用对象的->语法访问属性,这会导致报错或无输出。
修正后的代码
<?php $token = "你的实际token"; // 替换为你的有效token $url = "https://www.ncdc.noaa.gov/cdo-web/api/v2/datasets?stationid=COOP:010957"; $curl = curl_init($url); // 设置curl返回结果而非直接输出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 显式指定GET请求(curl默认就是GET,这里写出来更清晰) curl_setopt($curl, CURLOPT_HTTPGET, true); // 关键:将token放入请求头 curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'token: ' . $token ]); $curl_response = curl_exec($curl); // 先检查curl请求是否出错 if(curl_errno($curl)){ echo "CURL请求错误: " . curl_error($curl); } curl_close($curl); // 解析JSON并检查解析错误 $json_a = json_decode($curl_response, TRUE); if(json_last_error() !== JSON_ERROR_NONE){ echo "JSON解析失败: " . json_last_error_msg(); // 打印原始响应,方便排查API返回的异常内容 echo "\n原始响应内容: " . $curl_response; } else { var_dump($json_a); // 查看返回的结构 echo "\n"; // 根据NCDC API的返回结构,有效数据在results字段中 if(isset($json_a['results'])){ foreach($json_a['results'] as $row){ // 示例:输出数据集ID和名称 echo "数据集ID: {$row['id']}, 名称: {$row['name']}\n"; } } else { // 如果返回错误信息(比如token无效、权限问题) if(isset($json_a['status'])){ echo "API错误状态: {$json_a['status']}\n"; } } } ?>
额外提示
- 建议每次请求后都检查CURL错误和JSON解析错误,能快速定位问题(比如token失效、参数格式错误等)。
- 可以先用命令行curl测试请求是否正常,确认API返回有效数据后再写PHP代码,比如:
curl -H "token: 你的token" "https://www.ncdc.noaa.gov/cdo-web/api/v2/datasets?stationid=COOP:010957"
内容的提问来源于stack exchange,提问作者BenW
相关产品推荐
相关产品推荐

