PHP CURL DELETE请求
我正在尝试使用PHP和cURL来执行DELETE HTTP请求。
我已经读了很多地方如何做,但似乎没有为我工作。
这是我如何做到的:
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; }
然后我继续使用我的function:
public function deleteUser($extid) { $path = "/rest/user/".$extid."/;token=".$this->__token; $result = $this->curl_req($path,"","DELETE"); return $result; }
这给我HTTP内部服务器错误。 在我的其他函数使用相同的GET和POST curl_req方法,一切顺利。
那么我做错了什么?
我终于自己解决了。 如果其他人有这个问题,这是我的解决scheme:
我创build了一个新的方法:
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
由于这似乎有助于一些人,下面是我最后的curl DELETE方法,它在JSON解码对象中返回HTTP响应:
/** * @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所有types的请求,我已经创build了一个通用函数
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删除方法
$data = array('id'=>$_GET['did']); $result = CallAPI('DELETE', "DeleteCategory", $data);
调用Post方法
$data = array('title'=>$_POST['txtcategory'],'description'=>$_POST['txtdesc']); $result = CallAPI('POST', "InsertCategory", $data);
CALL获取方法
$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);
我自己的类请求与wsseauthentication
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; }