คำขอลบ PHP CURL


101

ฉันพยายามทำคำขอ DELETE http โดยใช้ PHP และ cURL

ฉันอ่านวิธีทำมาหลายที่แล้ว แต่ดูเหมือนจะไม่มีอะไรได้ผลสำหรับฉัน

นี่คือวิธีที่ฉันทำ:

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 เดียวกันกับ GET และ POST ทุกอย่างเป็นไปด้วยดี

แล้วฉันทำอะไรผิด?


3
ข้อผิดพลาดภายในเซิร์ฟเวอร์หมายความว่ามีปัญหากับสคริปต์ที่รับคำขอของคุณ
Brad

ขอบคุณแบรด - ฉันรู้ฉันเดาว่ามันเป็นเพราะมันไม่ได้ส่งเป็นคำขอ DELETE ถ้าฉันใช้ปลั๊กอินไคลเอนต์ REST สำหรับ Firefox และส่งคำขอเดียวกันกับ DELETE ก็ใช้ได้ดี ดังนั้นมันจึงเหมือนว่า cURL ไม่ส่งคำขอเป็น DELETE
Bolli

เกี่ยวข้อง? stackoverflow.com/questions/2081894/…
Marc B

ขอบคุณมาร์ค แต่มันดูเหมือนว่าเขากำลังทำสิ่งเดียวกับฉัน? เป็นไปไม่ได้ที่จะส่งคำขอ DELETE ด้วย PHP? หากมีวิธีอื่นกับ cURL ใต้ฉันก็เปิดให้ใช้เช่นกัน
Bolli

คำตอบ:


221

ในที่สุดฉันก็แก้ปัญหานี้ด้วยตัวเอง หากใครกำลังมีปัญหานี้นี่คือวิธีแก้ปัญหาของฉัน:

ฉันสร้างวิธีการใหม่:

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

เนื่องจากสิ่งนี้ดูเหมือนจะช่วยบางคนนี่คือวิธี curl DELETE สุดท้ายของฉันซึ่งส่งคืนการตอบสนอง HTTP ในวัตถุที่ถอดรหัส 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;
}

คุณช่วยบอกฉันได้ไหมว่าเราจะเรียก ajax ไปยัง php (วิธีการ: ลบ) ที่เก็บรหัส curl นี้ไว้และส่งผ่านค่าจาก ajax ได้อย่างไร
user1788736

@ user1788736 ฉันไม่เก่ง Ajax แต่ฉันเดาว่าคุณสามารถสร้างไฟล์ PHP ที่รันวิธีนี้ได้และด้วย Ajax จะส่งข้อมูลของคุณโดยใช้ POST ไปยังไฟล์ PHP นั้น หากคุณคิดว่าวิธีการข้างต้นสับสนให้ดูอีกครั้ง $ url s เป็นเพียงเซิร์ฟเวอร์ที่คุณต้องคุยด้วย ( someserver.com ) และ $ path คือสิ่งที่อยู่หลัง URL (/ something /) เหตุผลเดียวที่ฉันแยกสิ่งเหล่านี้ออกเป็นเพราะฉันต้องส่งไปยังเซิร์ฟเวอร์เดียวกันตลอดเวลา แต่ด้วยเส้นทางแบบไดนามิก หวังว่าจะสมเหตุสมผล
Bolli

ไม่ต้องการส่วนหัว?
er.irfankhan11

ฉันใช้รหัสเดียวกันและ Paypal ส่งคืนรหัส http: 204 หมายความว่าลบสำเร็จ แต่ฉันได้รับ 400 ตลอดเวลา
er.irfankhan11

1
@kuttoozz ที่เป็นตัวแปรส่วนตัวในคลาสของฉัน เป็นเพียง URL ที่คุณต้องใช้ในการร้องขอ อาจเป็นบางอย่างเช่นapi.someurl.comและ $ path คือสิ่งที่อยู่หลัง url นั้น (/ something /) คุณสามารถเปลี่ยนค่านั้นเป็น URL ของคุณหรือลบออกและรวม URL แบบเต็มในตัวแปร $ path มันสมเหตุสมผลไหม
Bolli

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

use + = instaead ของ array_merge
Adriwan Kenoby

วิธีนี้อาจใช้งานได้ แต่เป็นวิธีการแก้ปัญหาที่ซับซ้อนโดยไม่จำเป็น
Samuel Lindblom

0

สวิตช์ ($ method) {case "GET": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "GET"); หยุดพัก; กรณี "POST": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "POST"); หยุดพัก; กรณี "PUT": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "PUT"); หยุดพัก; กรณี "DELETE": curl_setopt ($ curl, 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;

}

ขอบคุณ. ในการเรียก REST โดยเฉพาะนี้ส่วน JSON ต้องว่างเปล่าจึงไม่มีปัญหา แต่ยังไงก็ขอบคุณ
Bolli

ที่$json emptyนี่หมายความว่าอย่างไร? มันไม่ได้อยู่ในขอบเขตภายในฟังก์ชันนี้ดังนั้นการใช้งาน$jsonจะไม่ทำอะไรเลย
halfer

ฉันขอให้ลบคำตอบนี้ แต่ผู้ดูแลบอกว่าไม่ ผู้โพสต์คำตอบนี้ไม่ได้ลงชื่อเข้าใช้ตั้งแต่ปี 2014 อย่างไรก็ตาม
แขวนคอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.