Я смотрю 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);