Запрос CURL на публикацию API, проходящий через базу данных - PullRequest
1 голос
/ 18 июня 2020

Я пытался выбрать значения (данные студентов) из mysql таблицы базы данных и перебирал базу данных для отправки в API, используя PHP CURL Post-запрос, но он не работает.

Это тело API:

{
    "students":[
        {
            "admissionNumber": "2010",
            "class":"js one"
        },
        {
            "admissionNumber": "2020",
            "class":"ss one"
        }
    ],
    "appDomain":"www.schooldomain.com"
}

Параметры, которые я хочу отправить, - это параметры admissionNumber и class, а appDomain одинаковы для всех. Вот мой код:

if(isset($_POST['submit'])){

       $body = "success";
       $info = "yes";


      class SendDATA
      {
        private $url = 'https://url-of-the-endpoint'; 
        private $username = '';  
        private $appDomain = 'http://schooldomain.com/';  



        // public function to commit the send
        public function send($admNo,$class)
        {
            $url_array=     array('admissionNumber'=>$admNo,'class'=>$class,'appDomain'=>$this-> appDomain);
            $url_string = $data = http_build_query($url_array);

            //   using the curl library to make the request
            $curlHandle = curl_init();
            curl_setopt($curlHandle, CURLOPT_URL, $this->url);
            curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $url_string);
            curl_setopt($curlHandle, CURLOPT_POST, 1);
            $responseBody = curl_exec($curlHandle);
            $responseInfo  = curl_getinfo($curlHandle);
            curl_close($curlHandle);

            return $this->handleResponse($responseBody,$responseInfo);
        }


        private function handleResponse($body,$info)
        {
            if ($info['http_code']==200){ // successful submission
                $xml_obj = simplexml_load_string($body);
                // extract 

                return true;
            }
            else{

                // error handling
                return false;
            }

        }

    }

    $sms = new SendDATA();

        $result = mysqli_query( $mysqli, "SELECT * FROM school_kids");

        while ($row = mysqli_fetch_array($result)) {
                $admNo = $row['admNo']; 
                $class = $row['class']; 
                $sms->send($admNo,$class,"header");

                echo $admNo. " ".$class;  

        }                                       
   }

1 Ответ

1 голос
/ 18 июня 2020

Вопрос довольно непонятный; когда вы говорите «это тело API», я предполагаю, что этот фрагмент JSON - это то, что ожидает REST API на https://url-of-the-endpoint. Если да, то вы неправильно строите тело запроса. http_build_query создает блок данных формы в кодировке URL (например, key=value&anotherKey=another_value), а не JSON. Для JSON вот что вы хотите:

$data = array('students' => array
(
    array('admissionNumber' => $admNo, 'class' => $class)
),
'appDomain':$this->appDomain
);
$url_string = $data = json_encode($data);

Кроме того, вы, вероятно, захотите удалить заголовки HTTP из ответа:

curl_setopt($curlHandle, CURLOPT_HEADER, false);
...