2012-11-16 21 views
71

मैं PHP और curl का उपयोग कर एक DELETE http अनुरोध करने का प्रयास कर रहा हूं।PHP कर्ल DELETE अनुरोध

मैंने पढ़ा है कि इसे कई जगह कैसे करें, लेकिन मेरे लिए कुछ भी काम नहीं करता है।

यह कैसे मैं यह कर रहा है:

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 आंतरिक सर्वर त्रुटि देता है। मेरे अन्य कार्यों में जीईटी और पोस्ट के साथ एक ही curl_req विधि का उपयोग करके, सब कुछ ठीक हो जाता है।

तो मैं गलत क्या कर रहा हूं?

+3

आंतरिक सर्वर त्रुटि का मतलब स्क्रिप्ट आपका अनुरोध प्राप्त होने के साथ एक समस्या थी प्राप्त करें। – Brad

+0

धन्यवाद ब्रैड - मुझे पता है, मुझे लगता है क्योंकि यह DELETE अनुरोध के रूप में नहीं भेजता है। अगर मैं फ़ायरफ़ॉक्स के लिए एक आरईएसटी क्लाइंट प्लगइन का उपयोग करता हूं और डेलेटी के साथ एक ही अनुरोध भेजता हूं, तो यह ठीक काम करता है। तो यह curl जैसे seams DELETE के रूप में अनुरोध नहीं भेज रहा है। – Bolli

+0

प्रासंगिक? http://stackoverflow.com/questions/2081894/handling-put-delete-arguments-in-php –

उत्तर

139

मैंने अंततः इसे स्वयं हल किया।

मैं एक नई विधि बनाया: किसी और को इस समस्या हो रही है, तो यहां मेरे समाधान है

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 विधि, जो 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; 
} 
+0

क्या आप मुझे बता सकते हैं कि हम php (विधि: हटाएं) पर AJAX कॉल कैसे करते हैं जो इस कर्ल कोड को हटाते हैं और इसे AJAX से मान देते हैं? – user1788736

+0

@ user1788736 मैं अजाक्स में अच्छा नहीं हूं, लेकिन मुझे लगता है कि आप एक PHP फ़ाइल बना सकते हैं जो इस विधि को निष्पादित करता है, और अजाक्स अपने PHP को उस PHP फ़ाइल में POST का उपयोग करके भेजता है। अगर आपको लगता है कि ऊपर की विधि भ्रमित है, तो फिर से देखें। $ url s बस जिस सर्वर से आपको बात करने की आवश्यकता है (http://someserver.com) और $ पथ यूआरएल (/ कुछ /) के बाद सामान है। इन्हें विभाजित करने का एकमात्र कारण यह है कि मुझे हर समय एक ही सर्वर पर भेजने की आवश्यकता है, लेकिन गतिशील पथ के साथ। उम्मीद है कि समझ में आता है। – Bolli

+0

हेडर की आवश्यकता नहीं है? –

-13
$json empty 

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

} 
+0

धन्यवाद। इस विशेष आरईएसटी कॉल में, जेएसओएन भाग खाली होना चाहिए, इसलिए यह कोई समस्या नहीं है। लेकिन वैसे भी – Bolli

+0

धन्यवाद '$ जेसन खाली' का मतलब क्या है? यह वैसे भी इस समारोह के दायरे में नहीं है, इसलिए '$ json' का उपयोग कुछ भी नहीं करेगा। – halfer

+0

मैंने इस उत्तर को हटाने के लिए कहा है, लेकिन एक मॉडरेटर ने कहा है। वैसे भी इस उत्तर के पोस्टर ने 2014 से साइन इन नहीं किया है। – halfer

0

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

उपयोग = = array_merge –

+0

का इंस्टाएड करें और यह अब काम करता है –

+0

शायद यह काम करता है , लेकिन समस्या के लिए एक अनावश्यक जटिल समाधान है। –

6

प्राप्त कॉल करने के लिए, पोस्ट, हटाएँ, अनुरोध के सभी प्रकार डाल, मैं बनाया है एक आम समारोह

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

कॉल हटा विधि

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

कॉल पोस्ट विधि

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

कॉल विधि

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

कॉल रखो विधि

$data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']); 
$result = CallAPI('POST', "UpdateCategory", $data); 
संबंधित मुद्दे