curl_setopt - curl delete php example
Solicitud PHP CURL DELETE (4)
Intento hacer una solicitud HTTP DELETE utilizando PHP y cURL.
He leído cómo hacerlo en muchos lugares, pero nada parece funcionar para mí.
Así es como lo hago:
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;
}
Luego sigo adelante y uso mi función:
public function deleteUser($extid)
{
$path = "/rest/user/".$extid."/;token=".$this->__token;
$result = $this->curl_req($path,"","DELETE");
return $result;
}
Esto me da un ERROR HTTP interno del servidor. En mis otras funciones usando el mismo método curl_req con GET y POST, todo va bien.
Entonces, ¿qué estoy haciendo mal?
Finalmente resolví esto yo mismo. Si alguien más tiene este problema, aquí está mi solución:
Creé un nuevo método:
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;
}
Actualización 2
Dado que esto parece ayudar a algunas personas, aquí está mi último método DELETE curl, que devuelve la respuesta HTTP en el objeto decodificado 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;
}
Mi propia solicitud de clase con autenticación 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;
}
}
Para llamar a GET, POST, DELETE, PUT Todo tipo de solicitud, he creado una función común
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 Method
$data = array(''id''=>$_GET[''did'']);
$result = CallAPI(''DELETE'', "DeleteCategory", $data);
Método de publicación CALL
$data = array(''title''=>$_POST[''txtcategory''],''description''=>$_POST[''txtdesc'']);
$result = CallAPI(''POST'', "InsertCategory", $data);
CALL Get Method
$data = array(''id''=>$_GET[''eid'']);
$result = CallAPI(''GET'', "GetCategoryById", $data);
CALL Put método
$data = array(''id''=>$_REQUEST[''eid''],m''title''=>$_REQUEST[''txtcategory''],''description''=>$_REQUEST[''txtdesc'']);
$result = CallAPI(''POST'', "UpdateCategory", $data);
$json empty
public function deleteUser($extid)
{
$path = "/rest/user/".$extid."/;token=".$this->__token;
$result = $this->curl_req($path,"**$json**","DELETE");
return $result;
}