Yêu cầu XÓA CURL trong PHP


100

Tôi đang cố thực hiện yêu cầu XÓA http bằng PHP và cURL.

Tôi đã đọc cách làm nó nhiều nơi, nhưng dường như không có gì hiệu quả với tôi.

Đây là cách tôi làm điều đó:

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

Sau đó, tôi tiếp tục và sử dụng chức năng của mình:

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

}

Điều này mang lại cho tôi LỖI máy chủ nội bộ HTTP. Trong các hàm khác của tôi bằng cách sử dụng cùng một phương thức curl_req với GET và POST, mọi thứ đều diễn ra tốt đẹp.

Vậy tôi đang làm gì sai?


3
Lỗi máy chủ nội bộ có nghĩa là đã xảy ra sự cố với tập lệnh nhận được yêu cầu của bạn.
Brad

Cảm ơn Brad - Tôi biết, tôi đoán là như vậy vì nó không gửi dưới dạng yêu cầu XÓA. Nếu tôi sử dụng một plugin ứng dụng khách REST cho Firefox và gửi cùng một yêu cầu với DELETE, nó hoạt động tốt. Vì vậy, nó nối như cURL không gửi yêu cầu dưới dạng DELETE.
Bolli


Cảm ơn Marc, nhưng nó có vẻ như anh ấy đang làm điều tương tự như tôi? Không thể gửi yêu cầu DELETE với PHP? Nếu có một cách khác với cURL, tôi cũng sẵn sàng sử dụng cách đó.
Bolli

Câu trả lời:


216

Cuối cùng tôi đã giải quyết được điều này. Nếu bất kỳ ai khác đang gặp vấn đề này, đây là giải pháp của tôi:

Tôi đã tạo một phương pháp mới:

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

Cập nhật 2

Vì điều này có vẻ giúp ích cho một số người, đây là phương thức DELETE curl cuối cùng của tôi, phương thức này trả về phản hồi HTTP trong đối tượng được giải mã 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;
}

bạn có thể cho tôi biết cách chúng ta thực hiện cuộc gọi ajax tới php (method: delete) giữ mã curl xóa này và chuyển nó giá trị từ ajax không?
user1788736

@ user1788736 Tôi không giỏi về Ajax, nhưng tôi đoán bạn có thể tạo một tệp PHP thực thi phương pháp này và với Ajax gửi dữ liệu của bạn bằng cách sử dụng POST tới tệp PHP đó. Nếu bạn nghĩ rằng phương pháp trên là khó hiểu, hãy xem lại. $ url s chỉ đơn giản là máy chủ bạn cần nói chuyện ( someserver.com ) và $ path là thứ nằm sau URL (/ something /). Lý do duy nhất tôi chia chúng ra, là vì tôi luôn phải gửi đến cùng một máy chủ, nhưng với các đường dẫn động. Hy vọng điều đó có ý nghĩa.
Bolli

Không cần tiêu đề?
er.irfankhan11

Tôi đang sử dụng cùng một mã, và Paypal trả về mã http: 204 có nghĩa là xóa thành công. nhưng tôi đã nhận được 400 lần.
er.irfankhan 11

1
@kuttoozz đó là một biến riêng trong lớp của tôi. Nó chỉ đơn giản là URL bạn cần để thực hiện yêu cầu. Nó có thể là một cái gì đó giống như api.someurl.com và $ path là những gì đi sau url đó (/ something /). Bạn có thể chỉ cần thay đổi giá trị đó thành URL của mình hoặc xóa nó và đưa URL đầy đủ vào biến $ path. Điều đó có ý nghĩa?
Bolli

19

Để gọi GET, POST, DELETE, PUT Tất cả các loại yêu cầu, tôi đã tạo một hàm chung

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

GỌI Phương pháp xóa

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

GỌI Phương thức đăng bài

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

GỌI Lấy phương thức

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

Phương pháp đặt CALL

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

làm tốt. Chỉ cần một lưu ý: mã phản hồi http cho xóa là 204. Tôi nghĩ bạn nên xem xét tất cả 20x mã như đáp ứng tốt :)
ryuujin

0

Yêu cầu lớp học của riêng tôi với xác thực 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 of array_merge
Adriwan Kenoby

Điều đó có thể hoạt động, nhưng là một giải pháp phức tạp không cần thiết cho vấn đề.
Samuel Lindblom

0

switch ($ method) {case "GET": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "GET"); phá vỡ; case "POST": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "POST"); phá vỡ; case "PUT": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "PUT"); phá vỡ; case "DELETE": curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "DELETE"); phá vỡ; }


-19
    $json empty

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

}

Cảm ơn. Trong cuộc gọi REST cụ thể này, phần JSON cần phải trống, vì vậy điều này không có vấn đề gì. Nhưng dù sao cũng cảm ơn
Bolli

Không gì $json emptycó nghĩa là ở đây? Dù sao thì nó cũng không nằm trong phạm vi bên trong chức năng này, vì vậy việc sử dụng $jsonsẽ không làm được gì cả.
halfer

Tôi đã yêu cầu xóa câu trả lời này, nhưng một người kiểm duyệt đã nói không. Dù sao người đăng câu trả lời này đã không đăng nhập từ năm 2014.
halfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.