PHP CURL DELETE अनुरोध


101

मैं 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;
}

मैं तब आगे बढ़ता हूं और अपने कार्य का उपयोग करता हूं:

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

}

यह मुझे HTTP आंतरिक सर्वर ERROR देता है। GET और POST के साथ समान कर्ल_रेक विधि का उपयोग करते हुए मेरे अन्य कार्यों में, सब कुछ ठीक हो जाता है।

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


3
आंतरिक सर्वर त्रुटि का मतलब है कि आपके अनुरोध को प्राप्त करने वाली स्क्रिप्ट में कोई समस्या थी।
ब्रैड

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

से मिलता जुलता? stackoverflow.com/questions/2081894/…
मार्क बी

धन्यवाद मार्क, लेकिन यह जैसे वह मेरे जैसे ही काम कर रहा है? क्या PHP के साथ DELETE अनुरोध भेजना असंभव है? अगर वहाँ मुँह cURL के साथ एक और तरीका है, मैं भी उपयोग करने के लिए खुला हूँ।
बोल्ली

जवाबों:


218

मैंने आखिरकार खुद को हल कर लिया। अगर किसी और को यह समस्या हो रही है, तो यहां मेरा समाधान है:

मैंने एक नई विधि बनाई:

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

अपडेट २

चूंकि यह कुछ लोगों की मदद करने के लिए लगता है, यहां मेरी अंतिम कर्ल 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;
}

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

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

क्या हेडर की जरूरत नहीं है?
er.irfankhan11

मैं एक ही कोड का उपयोग कर रहा हूं, और Paypal http कोड: 204 का अर्थ है कि यह सफलतापूर्वक डिलीट हो गया है। लेकिन मुझे हर समय 400 मिलते हैं।
er.irfankhan11

1
@kuttoozz मेरी कक्षा में एक निजी चर है। यह केवल URL है जिसे आपको अनुरोध करने की आवश्यकता है। यह api.someurl.com जैसा कुछ हो सकता है और $ पथ वह है जो उस url (/ कुछ /) के बाद जाता है। आप बस उस मूल्य को अपने URL में बदल सकते हैं या इसे हटा सकते हैं और $ URL चर में पूर्ण URL शामिल कर सकते हैं। क्या इसका कोई मतलब है?
बोलि

20

GET, POST, DELETE, PUT सभी प्रकार के अनुरोध को कॉल करने के लिए, मैंने एक सामान्य फ़ंक्शन बनाया है

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

बहुत बढ़िया। बस एक नोट: डिलीट के लिए http प्रतिक्रिया कोड 204 है। मुझे लगता है कि आपको सभी 20x कोडों को अच्छी प्रतिक्रिया के रूप में विचार करना चाहिए :)
ryuujin

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

array_merge + का उपयोग करें
Adriwan Kenoby

यह शायद काम करता है, लेकिन समस्या का एक अनावश्यक रूप से जटिल समाधान है।
सैमुअल लिंडब्लोम

0

स्विच ($ पद्धति) {केस "GET": curl_setopt ($ कर्ल, CURLOPT_CUSTOMREQUEST, "GET"); टूटना; मामला "POST": curl_setopt ($ कर्ल, CURLOPT_CUSTOMREQUEST, "POST"); टूटना; केस "PUT": curl_setopt ($ कर्ल, CURLOPT_CUSTOMREQUEST, "PUT"); टूटना; मामला "DELETE": curl_setopt ($ कर्ल, CURLOPT_CUSTOMREQUEST, "DELETE"); टूटना; }


-19
    $json empty

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

}

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

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

मैंने इस उत्तर को हटाने के लिए कहा है, लेकिन एक मॉडरेटर ने कहा नहीं। इस उत्तर के पोस्टर पर वैसे भी 2014 के बाद से कोई हस्ताक्षर नहीं किया गया है।
रोकें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.