PHP CURL DELETE 请求

Posted

技术标签:

【中文标题】PHP CURL DELETE 请求【英文标题】:PHP CURL DELETE request 【发布时间】:2012-11-05 10:27:43 【问题描述】:

我正在尝试使用 php 和 cURL 执行 DELETE http 请求。

我已经在很多地方阅读过如何做到这一点,但似乎没有什么对我有用。

这就是我的做法:

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 内部服务器错误。 在我的其他函数中,使用与 GET 和 POST 相同的 curl_req 方法,一切顺利。

那我做错了什么?

【问题讨论】:

服务器内部错误表示接收请求的脚本出现问题。 谢谢布拉德 - 我知道,我猜是因为它不是作为删除请求发送的。如果我为 Firefox 使用 REST 客户端插件并使用 DELETE 发送完全相同的请求,它工作正常。所以看起来 cURL 没有将请求作为 DELETE 发送。 相关? ***.com/questions/2081894/… 谢谢 Marc,但看起来他正在和我做同样的事情?用 PHP 发送 DELETE 请求是不可能的吗?如果没有 cURL 有其他方法,我也愿意使用。 【参考方案1】:

我终于自己解决了这个问题。如果其他人遇到这个问题,这是我的解决方案:

我创建了一个新方法:

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 方法,它以 JSON 解码对象返回 HTTP 响应:

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

【讨论】:

你能告诉我我们如何对持有这个删除 curl 代码的 php(method:delete) 进行 ajax 调用并从 ajax 传递它的值吗? @user1788736 我不擅长 Ajax,但我想您可以创建一个执行此方法的 PHP 文件,并使用 Ajax 使用 POST 将您的数据发送到该 PHP 文件。如果您认为上述方法令人困惑,请再看一遍。 $url 只是您需要与之交谈的服务器 (someserver.com),而 $path 是 URL (/something/) 之后的内容。我将它们分开的唯一原因是因为我需要一直发送到同一台服务器,但使用动态路径。希望这是有道理的。 我使用的是相同的代码,Paypal 返回 http 代码:204 表示删除成功。但我一直收到 400 个。 更新 2 不工作......当我们发送邮递区然后它不工作............ @kuttoozz 这是我班上的私有变量。它只是您需要向其发出请求的 URL。它可能类似于 api.someurl.com 和 $path 是该 url (/something/) 之后的内容。您可以简单地将该值更改为您的 URL 或将其删除并将完整的 URL 包含在 $path 变量中。这有意义吗?【参考方案2】:

为了调用 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);

CALL 发布方法

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

CALL 获取方法

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

调用放置方法

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

【讨论】:

干得好。请注意:删除的 http 响应代码是 204。我认为您应该将所有 20x 代码视为良好响应:)【参考方案3】:

我自己的带有 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; 
    

【讨论】:

使用 += 代替 array_merge 这可能有效,但解决问题的方法过于复杂。【参考方案4】:
switch ($method) 
    case "GET":
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
        break;
    case "POST":
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
        break;
    case "PUT":
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
        break;
    case "DELETE":
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); 
        break;

【讨论】:

【参考方案5】:
    $json empty

public function deleteUser($extid)

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


【讨论】:

谢谢。在这个特定的 REST 调用中,JSON 部分需要为空,所以这没有问题。不过还是谢谢 $json empty 在这里是什么意思?反正它不在这个函数的范围内,所以$json 的使用不会做任何事情。 我已要求删除此答案,但版主拒绝了。无论如何,这个答案的发布者自 2014 年以来就没有登录过。

以上是关于PHP CURL DELETE 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中获取curl请求的请求头信息及相应头信息

如何在php中获取curl请求的请求头信息及相应头信息

PHP原生CURL请求

转:PHP中的使用curl发送请求(GET请求和POST请求)

php curl模拟post请求提交数据样例总结

php curl模拟post请求的例子