PHP调用post.rest API遇query参数必填错误求助
解决API调用中"Parameter 'query' is required"的问题
我太懂你被这个问题卡好几天的烦躁了,咱们直接揪出核心问题:你的代码里犯了一个cURL POST请求的典型错误——当你设置Content-Type: application/json时,不能直接把数组传给CURLOPT_POSTFIELDS。
cURL的默认逻辑是:如果CURLOPT_POSTFIELDS接收的是数组,它会自动把请求的Content-Type改成multipart/form-data或者application/x-www-form-urlencoded,这和你手动设置的application/json完全冲突。结果就是API服务器接收到的不是它期望的JSON格式数据,自然识别不到query参数。
修改后的可运行代码
<?php $curl = curl_init(); // 先构造参数数组,再转成标准JSON字符串 $data = array( "query" => "SELECT l.areasymbol, l.areaname, l.lkey, musym, muname, museq, mu.mukey FROM sacatalog sac INNER JOIN legend l ON l.areasymbol = sac.areasymbol AND l.areatypename = 'Non-MLRA Soil Survey Area' INNER JOIN mapunit mu ON mu.lkey = l.lkey AND mu.mukey IN (455997) ", "FORMAT" => "JSON" ); $jsonData = json_encode($data); curl_setopt_array($curl, array( CURLOPT_URL => "https://SDMDataAccess.sc.egov.usda.gov/Tabular/post.rest", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $jsonData, // 这里传JSON字符串而非数组 CURLOPT_HTTPHEADER => array( "Cache-Control: no-cache", "Content-Type: application/json" // 移除Postman-Token,这是Postman专属标识,代码里不需要 ), )); // 保存转义后的JSON数据,方便调试检查 file_put_contents('soil_request.json', $jsonData); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } ?>
额外调试小贴士
- 打开生成的
soil_request.json文件,确认里面的JSON格式合法,query字段确实存在且有完整的SQL语句 - 如果还是有问题,可以开启cURL的 verbose 模式,查看实际发送的请求细节:
执行后查看curl_setopt($curl, CURLOPT_VERBOSE, true); $verboseLog = fopen('curl_debug.log', 'w'); curl_setopt($curl, CURLOPT_STDERR, $verboseLog);curl_debug.log,确认请求头的Content-Type是否为application/json,以及POST内容是否和你构造的JSON一致。
内容的提问来源于stack exchange,提问作者Lori
相关产品推荐
相关产品推荐

