Permintaan PHP CURL DELETE

100

Saya mencoba melakukan permintaan HAPUS http menggunakan PHP dan cURL.

Saya telah membaca cara melakukannya di banyak tempat, tetapi tidak ada yang berhasil untuk saya.

Inilah cara saya melakukannya:

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

Saya kemudian melanjutkan dan menggunakan fungsi saya:

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

}

Ini memberi saya KESALAHAN server internal HTTP. Dalam fungsi saya yang lain menggunakan metode curl_req yang sama dengan GET dan POST, semuanya berjalan dengan baik.

Jadi apa yang saya lakukan salah?

Bolli
sumber
3
Kesalahan server internal berarti ada masalah dengan skrip yang menerima permintaan Anda.
Brad
Terima kasih Brad - Saya tahu, saya rasa ini karena tidak dikirim sebagai permintaan DELETE. Jika saya menggunakan plugin klien REST untuk Firefox dan mengirim permintaan yang sama persis dengan DELETE, itu berfungsi dengan baik. Jadi jahitannya seperti cURL tidak mengirim permintaan sebagai DELETE.
Bolli
Terima kasih Marc, tapi sepertinya dia melakukan hal yang sama denganku? Apakah tidak mungkin mengirim permintaan DELETE dengan PHP? Jika ada cara lain tanpa cURL, saya terbuka untuk menggunakannya juga.
Bolli

Jawaban:

216

Saya akhirnya menyelesaikan ini sendiri. Jika ada orang lain yang mengalami masalah ini, inilah solusi saya:

Saya membuat metode baru:

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

Perbarui 2

Karena ini tampaknya membantu beberapa orang, berikut adalah metode DELETE curl terakhir saya, yang mengembalikan respons HTTP dalam objek yang didekodekan 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;
}
Bolli
sumber
dapatkah Anda memberi tahu saya bagaimana kita melakukan panggilan ajax ke php (metode: delete) yang menahan kode delete curl ini dan meneruskan nilainya dari ajax?
pengguna1788736
@ user1788736 Saya tidak pandai Ajax, tapi saya rasa Anda dapat membuat file PHP yang menjalankan metode ini, dan dengan Ajax mengirim data Anda menggunakan POST ke file PHP tersebut. Jika menurut Anda metode di atas membingungkan, lihat lagi. $ url s hanya server yang Anda perlukan untuk berbicara dengan ( someserver.com ) dan $ path adalah barang setelah URL (/ sesuatu /). Satu-satunya alasan saya memisahkan ini, adalah karena saya perlu mengirim ke server yang sama setiap saat, tetapi dengan jalur dinamis. Harapan itu masuk akal.
Bolli
Tidak membutuhkan tajuk?
er.irfankhan11
Saya menggunakan kode yang sama, Dan Paypal mengembalikan kode http: 204 itu berarti menghapus berhasil. tetapi saya telah menerima 400 sepanjang waktu.
er.irfankhan11
1
@kuttoozz itu adalah variabel privat di kelas saya. Ini hanyalah URL yang Anda butuhkan untuk mengajukan permintaan. Ini bisa menjadi sesuatu seperti api.someurl.com dan $ path adalah apa yang terjadi setelah url itu (/ sesuatu /). Anda cukup mengubah nilai itu ke URL Anda atau menghapusnya dan memasukkan URL lengkap ke dalam variabel $ path. Apakah itu masuk akal?
Bolli
19

Untuk memanggil GET, POST, DELETE, PUT Semua jenis permintaan, saya telah membuat satu fungsi umum

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 Hapus Metode

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

CALL Metode Posting

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

CALL Dapatkan Metode

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

CALL Put Metode

$data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']);
$result = CallAPI('POST', "UpdateCategory", $data);
Juned Ansari
sumber
sudah selesai dilakukan dengan baik. Sekadar catatan: kode respons http untuk penghapusan adalah 204. Saya pikir Anda harus mempertimbangkan semua kode 20x sebagai respons yang baik :)
ryuujin
0

Permintaan kelas saya sendiri dengan otentikasi 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; 
    }
}
Adriwan Kenoby
sumber
gunakan + = instaead dari array_merge
Adriwan Kenoby
Itu mungkin berhasil, tetapi merupakan solusi kompleks yang tidak perlu untuk masalah tersebut.
Samuel Lindblom
0

switch ($ metode) {case "GET": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "GET"); istirahat; case "POST": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "POST"); istirahat; case "PUT": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "PUT"); istirahat; case "DELETE": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "DELETE"); istirahat; }

Peter Ahumuza
sumber
-19
    $json empty

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

}
KELOMPOK UZSTYLE
sumber
Terima kasih. Dalam panggilan REST khusus ini, bagian JSON harus dikosongkan, jadi ini tidak masalah. Tapi terima kasih
Bolli
Apa $json emptymaksudnya disini? Itu tidak ada dalam ruang lingkup di dalam fungsi ini, jadi penggunaan $jsontidak akan melakukan apa-apa.
halfer
Saya telah meminta jawaban ini untuk dihapus, tetapi moderator mengatakan tidak. Poster jawaban ini belum masuk sejak 2014.
halfer