PHP CURL DELETE request

156,991

Solution 1

I finally solved this myself. If anyone else is having this problem, here is my solution:

I created a new method:

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

Update 2

Since this seems to help some people, here is my final curl DELETE method, which returns the HTTP response in JSON decoded object:

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

Solution 2

To call GET,POST,DELETE,PUT All kind of request, i have created one common function

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 Delete Method

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

CALL Post Method

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

CALL Get Method

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

CALL Put Method

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

Related videos on Youtube

Bolli
Author by

Bolli

...

Updated on October 25, 2021

Comments

  • Bolli
    Bolli over 2 years

    I'm trying to do a DELETE http request using PHP and cURL.

    I have read how to do it many places, but nothing seems to work for me.

    This is how I do it:

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

    I then go ahead and use my function:

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

    This gives me HTTP internal server ERROR. In my other functions using the same curl_req method with GET and POST, everything goes well.

    So what am I doing wrong?

    • Brad
      Brad over 11 years
      The internal server error means there was a problem with the script receiving your request.
    • Bolli
      Bolli over 11 years
      Thanks Brad - I know, I guess its because its not send as DELETE request. If I use a REST client plugin for Firefox and send the exact same request with DELETE, it works fine. So it seams like cURL is not sending the request as DELETE.
    • Marc B
      Marc B over 11 years
    • Bolli
      Bolli over 11 years
      Thanks Marc, but it seams like he is doing the same thing as me? Is it impossible to send DELETE requests with PHP? If there is another way withouth cURL, I'm open to use that as well.
  • user1788736
    user1788736 over 10 years
    can you tell me how we do ajax call to the php(method:delete) that hold this delete curl code and pass it value from ajax ?
  • Bolli
    Bolli over 10 years
    @user1788736 I'm not good at Ajax, but I guess you could create a PHP file that executes this method, and with Ajax send your data using POST to that PHP file. If you think the method above is confusing, look again. $url s simply the server you need to talk with (someserver.com) and $path is the stuff after the URL (/something/). The only reason I split these up, is because I need to send to the same server all the time, but with dynamic paths. Hope that makes sense.
  • er.irfankhan11
    er.irfankhan11 over 8 years
    I am using same code, And Paypal return http code:204 it mean delete successfully. but I have receive 400 all time.
  • Muhammad Fahad
    Muhammad Fahad about 8 years
    Update 2 is not working ..... When We send postfields then it is not working.........
  • Muhammad Fahad
    Muhammad Fahad about 8 years
    Can we send data in array form instead of json form?
  • Bolli
    Bolli about 8 years
    @MuhammadFahad Do you need to send data with your delete request? Try sending your data array to the function urlencodeded. $data = urlencode($yourDataArray); curl_del($path, $data); Does that work?
  • Adriwan Kenoby
    Adriwan Kenoby over 7 years
    use += instaead of array_merge
  • Prifulnath
    Prifulnath about 7 years
    @Bolli : hi, can you please explain what is and what is the value of $this->__url .
  • Bolli
    Bolli about 7 years
    @kuttoozz that is a private variable in my class. It's simply the URL you need to make requests to. It could be something like api.someurl.com and $path is what goes after that url (/something/) . You can simply change that value to your URL or remove it and include the full URL in the $path variable. Does that make sense?
  • Alberto
    Alberto over 6 years
    @MuhammadFahad the cURL request accepts json-formatted data, so if you have your array, simply convert to json using json_encode function json_encode($yourArray);
  • Samuel Lindblom
    Samuel Lindblom about 6 years
    That probably works, but is an unnecessarily complex solution to the problem.
  • ryuujin
    ryuujin almost 5 years
    well done. Just a note: the http response code for delete is 204. I think you should consider all 20x codes as good response :)
  • Sillo
    Sillo about 2 years
    Since the key is the same as the method, why not just use: curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); Much cleaner.. However i'd do a check for the $method value first though.