2012-11-16 24 views
71

Próbuję wykonać polecenie DELETE http przy użyciu PHP i cURL.PHP CURL DELETE request

Przeczytałem, jak zrobić to w wielu miejscach, ale nic nie działa dla mnie.

To jak to zrobić:

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

I potem iść dalej i korzystać z funkcji:

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

} 

To daje mi http Internal Server Error. W innych moich funkcjach używających tej samej metody curl_req z GET i POST wszystko idzie dobrze.

Co więc robię źle?

+3

Błąd serwera wewnętrznego oznacza, że ​​był problem ze skryptem otrzymania zapytania. – Brad

+0

Dzięki Brad - Wiem, myślę, że to dlatego, że nie jest wysyłane jako żądanie DELETE. Jeśli użyję wtyczki klienta REST do Firefoksa i wyślę dokładnie to samo żądanie z DELETE, to działa dobrze. Więc szwy jak cURL nie wysyła żądania jako DELETE. – Bolli

+0

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

Odpowiedz

139

W końcu to rozwiązałem. Jeśli ktoś ma ten problem, tu jest moje rozwiązanie:

I stworzył nową metodę:

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

Update 2

Ponieważ wydaje się pomóc niektórym ludziom, tu jest moja ostateczna curl DELETE metodę, która zwraca odpowiedzi HTTP w JSON zdekodowanej obiektu:

/** 
* @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

czy możesz mi powiedzieć, jak wykonujemy wywołanie ajax do php (metoda: delete), które posiadają ten kod curl usunąć i przekazać wartość z ajax? – user1788736

+0

@ user1788736 Nie jestem dobry w Ajax, ale domyślam się, że mógłbyś stworzyć plik PHP, który wykonuje tę metodę, a przy Ajaksie przesyłaj twoje dane używając POST do tego pliku PHP. Jeśli uważasz, że powyższa metoda jest myląca, spójrz jeszcze raz. $ url s po prostu serwer, z którym chcesz porozmawiać (http://someserver.com), a $ path to rzeczy po adresie URL (/ coś /). Jedynym powodem, dla którego je podzieliłem, jest to, że muszę wysyłać do tego samego serwera przez cały czas, ale z dynamicznymi ścieżkami. Mam nadzieję, że ma to sens. – Bolli

+0

Nie potrzebuje nagłówka? –

-13
$json empty 

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

} 
+0

Dzięki. W tym konkretnym wywołaniu REST część JSON musi być pusta, więc nie stanowi to problemu. Ale i tak dziękuję – Bolli

+0

Co znaczy "$ json empty"? Nie jest to jednak w zasięgu tej funkcji, więc użycie '$ json' nic nie da. – halfer

+0

Poprosiłem o usunięcie tej odpowiedzi, ale moderator powiedział, że nie. Plakat tej odpowiedzi nie został podpisany od 2014 roku. – halfer

0

moje własne klasy prośbę z uwierzytelnianiem 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

użyj + = instaead z array_merge –

+0

i działa teraz –

+0

Który prawdopodobnie działa , ale jest niepotrzebnie złożonym rozwiązaniem problemu. –

6

Aby połączyć GET, POST, DELETE, PUT Wszelkiego rodzaju prośby, i stworzyli jeden wspólny funkcja

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 Usuń Method

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

CALL Post Method

$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 Method

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