PHP中的REST API请求-查询错误

PHP中的REST API请求-查询错误,php,rest,api,Php,Rest,Api,我正在使用其post.rest web服务向API发出请求。我已经用邮递员构造了请求。我收到错误消息,“参数‘query’是必需的,它必须有一个值。”我已经试着解决这个问题好几天了,我束手无策。我以为我自己可以解决,但没有成功。看起来我已经尝试了至少一百种不同的代码排列 以下是我的请求PHP代码: <?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL =>

我正在使用其post.rest web服务向API发出请求。我已经用邮递员构造了请求。我收到错误消息,“参数‘query’是必需的,它必须有一个值。”我已经试着解决这个问题好几天了,我束手无策。我以为我自己可以解决,但没有成功。看起来我已经尝试了至少一百种不同的代码排列

以下是我的请求PHP代码:

     <?php
     $curl = curl_init();

     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 => 
        $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"),
     CURLOPT_HTTPHEADER => array(
        "Cache-Control: no-cache",
        "Content-Type: application/json",
        "Postman-Token: 520636bc-a062-4ab8-99e7-7edaae5118b4"
      ),
    ));

    file_put_contents('soil_request.txt', $data);
    $response = curl_exec($curl);

    $err = curl_error($curl);

    curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
从它看来,您可能需要在发送数据数组之前将其更改为json字符串

还有,你的台词是

CURLOPT_POSTFIELDS=>$data=array(“选择…”

这是错误的

相反,请定义数据数组,然后从中构建http查询字符串。此外,参数名称区分大小写,因此您希望使用
query
而不是
query
format
而不是
format

工作守则-

 <?php

    $data["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)";

     $data["format"] = "JSON";

     $curl = curl_init();

     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 => http_build_query($data),
     CURLOPT_HTTPHEADER => array(
        "Cache-Control: no-cache",
        "Content-Type: application/json",
        "Postman-Token: 520636bc-a062-4ab8-99e7-7edaae5118b4"
      ),
    ));

    file_put_contents('soil_request.txt', $data);
    $response = curl_exec($curl);

    $err = curl_error($curl);

    curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

看起来您可能需要在发送之前将数据数组更改为json字符串it@ivanivan好的。我从那篇文章中看到,下面的代码可以做到这一点。$data\u string=json\u encode($data);但我不知道需要在哪里插入它。试试
$data=json\u encode($data)
@Ivan谢谢你。它成功地得到了一个结果。但是现在结果给了我一个字符串,这个字符串没有响应json_decode()。结果应该是一个数组,但不是。这是我之前遇到的问题,我想我可以通过修改请求来解决。我已经用工作代码编辑了我的答案。谢谢!这看起来很好,但我今天必须停下来。我可以在早上回到它,并尝试您建议的内容。希望如此我会的。这太完美了!谢谢!非常非常满意它终于可以工作了!