2012-11-16 3 views
71

J'essaie de faire une requête HTTP DELETE en utilisant PHP et cURL.PHP CURL SUPPRIMER la demande

J'ai lu comment le faire beaucoup d'endroits, mais rien ne semble fonctionner pour moi.

Voici comment je le fais:

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; 
} 

Je continuez et utiliser ma fonction:

public function deleteUser($extid) 
{ 
    $path = "/rest/user/".$extid."/;token=".$this->__token; 
    $result = $this->curl_req($path,"","DELETE"); 
    return $result; 

} 

Cela me donne HTTP erreur interne du serveur. Dans mes autres fonctions utilisant la même méthode curl_req avec GET et POST, tout se passe bien.

Alors qu'est-ce que je fais mal?

+3

L'erreur interne du serveur signifie qu'il y avait un problème avec le script réception de votre demande. – Brad

+0

Merci Brad - Je sais, je suppose que c'est parce que ce n'est pas envoyé comme demande de suppression. Si j'utilise un plugin client REST pour Firefox et que j'envoie exactement la même requête avec DELETE, cela fonctionne correctement. Donc, il semble que cURL n'envoie pas la requête en tant que DELETE. – Bolli

+0

Important? http://stackoverflow.com/questions/2081894/handling-put-delete-arguments-in-php –

Répondre

139

J'ai finalement résolu cela moi-même. Si quelqu'un d'autre est d'avoir ce problème, voici ma solution:

J'ai créé une nouvelle méthode:

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; 
} 

Mise à jour 2

Depuis cela semble aider certaines personnes, voici ma dernière curl Méthode DELETE, qui renvoie la réponse HTTP dans l'objet décodé 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; 
} 
+0

pouvez-vous me dire comment nous faisons appel ajax au php (méthode: supprimer) qui détiennent ce code curl supprimer et lui transmettre la valeur de ajax? – user1788736

+0

@ user1788736 Je ne suis pas bon à Ajax, mais je suppose que vous pourriez créer un fichier PHP qui exécute cette méthode, et avec Ajax envoyer vos données en utilisant POST à ​​ce fichier PHP. Si vous pensez que la méthode ci-dessus est déroutante, regardez à nouveau. $ url est simplement le serveur avec lequel vous devez parler (http://someserver.com) et $ path est l'élément après l'URL (/ something /). La seule raison pour laquelle je les divise, c'est parce que je dois envoyer au même serveur tout le temps, mais avec des chemins dynamiques. J'espère que cela a du sens. – Bolli

+0

N'a pas besoin d'en-tête? –

-13
$json empty 

public function deleteUser($extid) 
{ 
    $path = "/rest/user/".$extid."/;token=".$this->__token; 
    $result = $this->curl_req($path,"**$json**","DELETE"); 
    return $result; 

} 
+0

Merci. Dans cet appel REST particulier, la partie JSON doit être vide, ce qui ne pose aucun problème. Mais merci quand même – Bolli

+0

Que veut dire '$ json empty' ici? Il n'est pas dans la portée de cette fonction de toute façon, donc l'utilisation de '$ json' ne fera rien. – halfer

+0

J'ai demandé que cette réponse soit supprimée, mais un modérateur a dit non. L'affiche de cette réponse n'a pas été signée depuis 2014 de toute façon. – halfer

0

Ma propre demande de classe avec l'authentification 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; 
    } 
} 
+0

utilisez + = instaead de array_merge –

+0

et cela fonctionne maintenant –

+0

Cela fonctionne probablement , mais est une solution inutilement complexe au problème. –

6

Pour appeler GET, POST, SUPPRIMER, PUT Tous les types de demande, j'ai créé une fonction commune

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; 
} 

APPEL Méthode Delete

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

CALL Méthode post

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

APPEL méthode Obtenir

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

Mettre un appel Méthode

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