PHP CURL DELETE isteği


101

PHP ve cURL kullanarak bir DELETE http isteği yapmaya çalışıyorum.

Pek çok yerde nasıl yapılacağını okudum, ama hiçbir şey benim için işe yaramıyor.

Ben böyle yaparım:

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

Sonra devam ediyorum ve işlevimi kullanıyorum:

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

}

Bu bana HTTP dahili sunucu ERROR veriyor. GET ve POST ile aynı curl_req yöntemini kullanan diğer işlevlerimde her şey yolunda gidiyor.

Öyleyse neyi yanlış yapıyorum?


3
Dahili sunucu hatası, isteğinizi alan komut dosyasında bir sorun olduğu anlamına gelir.
Brad

Teşekkürler Brad - Biliyorum, SİLME isteği olarak gönderilmediği için sanırım. Firefox için bir REST istemci eklentisi kullanırsam ve aynı isteği DELETE ile gönderirsem, sorunsuz çalışır. Bu yüzden cURL, isteği SİL olarak göndermiyormuş gibi görünüyor.
Bolli


Teşekkürler Marc, ama benimle aynı şeyi yapıyormuş gibi mi görünüyor? PHP ile DELETE istekleri göndermek imkansız mı? CURL'siz başka bir yol varsa, onu da kullanmaya açığım.
Bolli

Yanıtlar:


218

Sonunda bunu kendim çözdüm. Başka biri bu sorunu yaşıyorsa, işte benim çözümüm:

Yeni bir yöntem oluşturdum:

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

Güncelleme 2

Bu bazı insanlara yardımcı olduğu için, işte benim son curl DELETE yöntemim, JSON kodu çözülmüş nesnede HTTP yanıtını döndürüyor:

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

Bu delete curl kodunu tutan ve ajax'tan değerini ileten php'ye (yöntem: delete) ajax çağrısını nasıl yaptığımızı söyleyebilir misiniz?
user1788736

@ user1788736 Ajax'ta iyi değilim, ama sanırım bu yöntemi çalıştıran bir PHP dosyası oluşturabilirsin ve Ajax ile POST kullanarak verilerinizi bu PHP dosyasına gönderebilirsiniz. Yukarıdaki yöntemin kafa karıştırıcı olduğunu düşünüyorsanız, tekrar bakın. $ url basitçe konuşmanız gereken sunucudur ( someserver.com ) ve $ yol ise URL'den (/ bir şey /) sonra gelen şeydir. Bunları bölmemin tek nedeni, her zaman aynı sunucuya, ancak dinamik yollarla göndermem gerektiğidir. Umarım mantıklıdır.
Bolli

Başlığa ihtiyaç yok mu?
er.irfankhan11

Ben de aynı kodu kullanıyorum ve Paypal dönüş http kodu: 204, bu başarıyla silmek anlamına geliyor. ama her zaman 400 aldım.
er.irfankhan11

1
@kuttoozz bu sınıfımdaki özel bir değişken. Bu, yalnızca istekte bulunmanız gereken URL'dir. Api.someurl.com gibi bir şey olabilir ve $ yol bu url'den (/ bir şey /) sonra gelen şeydir. Bu değeri URL'niz olarak değiştirebilir veya kaldırabilir ve tam URL'yi $ path değişkenine ekleyebilirsiniz. bu mantıklı mı?
Bolli

20

GET, POST, DELETE, PUT (GET, POST, DELETE, PUT) çağırmak için her tür istek, ortak bir işlev oluşturdum

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

ÇAĞRI Silme Yöntemi

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

ÇAĞRI Gönderme Yöntemi

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

ÇAĞRI Get Metodu

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

CALL Put Yöntemi

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

aferin. Sadece bir not: Silme için http yanıt kodu
204'tür.

0

WSSE kimlik doğrulamalı kendi sınıf isteğim

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

+ = instaead of array_merge kullanın
Adriwan Kenoby

Bu muhtemelen işe yarıyor, ancak soruna gereksiz yere karmaşık bir çözüm.
Samuel Lindblom

0

switch ($ yöntem) {case "GET": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "GET"); kırmak; case "POST": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "POST"); kırmak; durum "PUT": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "PUT"); kırmak; case "DELETE": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "DELETE"); kırmak; }


-19
    $json empty

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

}

Teşekkürler. Bu belirli REST çağrısında, JSON kısmının boş olması gerekir, bu yüzden bu sorun değil. Yine de teşekkürler
Bolli

$json emptyBurada ne anlama geliyor? Zaten bu işlevin içinde kapsam dahilinde değildir, dolayısıyla kullanımı $jsonhiçbir şey yapmaz.
halfer

Bu cevabın silinmesini istedim, ancak bir moderatör hayır dedi. Bu cevabın afişi zaten 2014'ten beri giriş yapmadı.
2017
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.