Запрос API через Curl / PHP

Я смотрю API-интерфейс Parse.com REST и выполняет вызовы с использованием оболочки Curl PHP.

Кодовый код (работает):

curl -X GET \ -H "X-Parse-Application-Id: myApplicationID" \ -H "X-Parse-REST-API-Key: myRestAPIKey" \ https://api.parse.com/1/classes/Steps 

Код PhP (работает):

 $ch = curl_init('https://api.parse.com/1/classes/Steps'); curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Parse-Application-Id: myApplicationID', 'X-Parse-REST-API-Key: myRestAPIKey', 'Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); curl_close($ch); 

Это хорошо и денди, но теперь, когда я пытаюсь добавить ограничение запроса:

Кодовый код (работает):

 curl -X GET \ -H "X-Parse-Application-Id: myApplicationID" \ -H "X-Parse-REST-API-Key: myRestAPIKey" \ -G \ --data-urlencode 'where={"steps":9243}' \ https://api.parse.com/1/classes/Steps 

Увы, мы в конечном итоге дошли до моего вопроса. Что такое php-аналог вышеуказанного кода?

PHP-код (не работает):

 $ch = curl_init('https://api.parse.com/1/classes/Steps'); $query = urlencode('where={"steps":9243}'); curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Parse-Application-Id: myApplicationID', 'X-Parse-REST-API-Key: myRestAPIKey', 'Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); curl_exec($ch); curl_close($ch); 

Ответ на ошибку:

 Object ( [code] => 107 [error] => invalid json: where%3D%7B%22steps%22%3A9243%7D ) 

Ваш последний пример PHP изменил запрос на POST из GET. Передайте свои параметры в строке запроса вместо тела POST. Пытаться:

 $query = urlencode('where={"steps":9243}'); $ch = curl_init('https://api.parse.com/1/classes/Steps?'.$query); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'X-Parse-Application-Id: myApplicationID', 'X-Parse-REST-API-Key: myRestAPIKey', 'Content-Type: application/json' ) ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); curl_close($ch); 

Эта строка:

 curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 

пытается установить тело запроса, что недопустимо для запроса GET. cURL, похоже, позволяет вам установить тело по запросу GET ( пример ).

Похоже, ваш PHP не делает запрос POST (по крайней мере, я могу сказать, глядя на другие примеры PHP, которые используют curl_setopt($ch,CURLOPT_POST, count($fields)); . Я считаю, что вам нужно передать массив вариант postfields:

 $fields = array( 'where' => urlencode('{"steps":9243}') ); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); 

Попробуй это:

 $query = json_encode( array( 'where' => array( 'steps' => 9243 ) ) ); 

Я почерпнул это отсюда – не проверял! Пример Python представляет JSON-кодирование запроса перед его отправкой, поэтому, возможно, стоит попробовать это.

Чтобы позвонить GET, POST, DELETE, PUT Весь вид запроса, я создал одну общую функцию

 define("SITEURL", "http://localhost:82/slimdemo/RESTAPI"); function CallAPI($method, $api, $data, $headers) { $url = SITEURL . "/" . $api; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); switch ($method) { case "GET": curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); break; case "POST": curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); break; case "PUT": curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); break; case "DELETE": curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); break; } $response = curl_exec($curl); $data = json_decode($response); /* Check for 404 (file not found). */ $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // Check the HTTP Status code switch ($httpCode) { case 200: $error_status = "200: Success"; return ($data); break; case 404: $error_status = "404: API Not found"; break; case 500: $error_status = "500: servers replied with an error."; break; case 502: $error_status = "502: servers may be down or being upgraded. Hopefully they'll be OK soon!"; break; case 503: $error_status = "503: service unavailable. Hopefully they'll be OK soon!"; break; default: $error_status = "Undocumented error: " . $httpCode . " : " . curl_error($curl); break; } curl_close($curl); echo $error_status; die; } 

CALL DeleteAPI

 $data = array('id'=>$_GET['did']); $header = array('USERTOKEN:' . GenerateToken()); $result = CallAPI('DELETE', "DeleteCategory", $data, $header); 

CALL PostAPI

 $data = array('title'=>$_POST['txtcategory'],'description'=>$_POST['txtdesc']); $header = array('USERTOKEN:' . GenerateToken()); $result = CallAPI('POST', "InsertCategory", $data, $header); 

CALL GetAPI

 $data = array('id'=>$_GET['eid']); $header = array('USERTOKEN:' . GenerateToken()); $result = CallAPI('GET', "GetCategoryById", $data, $header); 

CALL PutAPI

 $data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']); $header = array('USERTOKEN:' . GenerateToken()); $result = CallAPI('POST', "UpdateCategory", $data, $header);