Я пытаюсь выполнить запрос DELETE http с помощью PHP и cURL.
Я читал, как делать это во многих местах, но ничего не работает для меня.
Вот как я это делаю:
public function curl_req($path,$json,$req) { $ch = curl_init($this->__url.$path); $data = json_encode($json); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $req); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data))); $result = curl_exec($ch); $result = json_decode($result); return $result; }
Затем я использую свою функцию:
public function deleteUser($extid) { $path = "/rest/user/".$extid."/;token=".$this->__token; $result = $this->curl_req($path,"","DELETE"); return $result; }
Это дает мне HTTP-сервер ERROR. В моих других функциях, используя тот же метод curl_req с GET и POST, все идет хорошо.
Так что я делаю неправильно?
Я, наконец, решил это сам. Если у кого-то еще есть эта проблема, вот мое решение:
Я создал новый метод:
public function curl_del($path) { $url = $this->__url.$path; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $result; }
Обновление 2
Поскольку это, по-видимому, помогает некоторым людям, вот мой последний метод DELETE curl, который возвращает HTTP-ответ в декодированном объекте JSON:
/** * @desc Do a DELETE request with cURL * * @param string $path path that goes after the URL fx. "/user/login" * @param array $json If you need to send some json with your request. * For me delete requests are always blank * @return Obj $result HTTP response from REST interface in JSON decoded. */ public function curl_del($path, $json = '') { $url = $this->__url.$path; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_POSTFIELDS, $json); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); $result = json_decode($result); curl_close($ch); return $result; }
Чтобы позвонить GET, POST, DELETE, PUT Весь вид запроса, я создал одну общую функцию
function CallAPI($method, $api, $data) { $url = "http://localhost:82/slimdemo/RESTAPI/" . $api; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 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 Delete
$data = array('id'=>$_GET['did']); $result = CallAPI('DELETE', "DeleteCategory", $data);
Метод CALL Post
$data = array('title'=>$_POST['txtcategory'],'description'=>$_POST['txtdesc']); $result = CallAPI('POST', "InsertCategory", $data);
Метод CALL Get
$data = array('id'=>$_GET['eid']); $result = CallAPI('GET', "GetCategoryById", $data);
Метод CALL Put
$data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']); $result = CallAPI('POST', "UpdateCategory", $data);
Мой собственный запрос класса с аутентификацией wsse
class Request { protected $_url; protected $_username; protected $_apiKey; public function __construct($url, $username, $apiUserKey) { $this->_url = $url; $this->_username = $username; $this->_apiKey = $apiUserKey; } public function getHeader() { $nonce = uniqid(); $created = date('c'); $digest = base64_encode(sha1(base64_decode($nonce) . $created . $this->_apiKey, true)); $wsseHeader = "Authorization: WSSE profile=\"UsernameToken\"\n"; $wsseHeader .= sprintf( 'X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $this->_username, $digest, $nonce, $created ); return $wsseHeader; } public function curl_req($path, $verb=NULL, $data=array()) { $wsseHeader[] = "Accept: application/vnd.api+json"; $wsseHeader[] = $this->getHeader(); $options = array( CURLOPT_URL => $this->_url . $path, CURLOPT_HTTPHEADER => $wsseHeader, CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false ); if( !empty($data) ) { $options += array( CURLOPT_POSTFIELDS => $data, CURLOPT_SAFE_UPLOAD => true ); } if( isset($verb) ) { $options += array(CURLOPT_CUSTOMREQUEST => $verb); } $ch = curl_init(); curl_setopt_array($ch, $options); $result = curl_exec($ch); if(false === $result ) { echo curl_error($ch); } curl_close($ch); return $result; } }
$json empty public function deleteUser($extid) { $path = "/rest/user/".$extid."/;token=".$this->__token; $result = $this->curl_req($path,"**$json**","DELETE"); return $result; }