PHP CURL删除请求


100

我正在尝试使用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方法,一切运行顺利。

那我在做什么错?


3
内部服务器错误表示脚本收到您的请求时出现问题。
Brad 2012年

谢谢布拉德-我知道,我想是因为它没有作为DELETE请求发送。如果我为Firefox使用REST客户端插件,并使用DELETE发送完全相同的请求,则效果很好。因此,它看起来像cURL没有将请求发送为DELETE。
博利2012年


谢谢马克,但这似乎像他在做我一样吗?用PHP发送DELETE请求是不可能的吗?如果还有没有cURL的其他方法,我也可以使用它。
博利2012年

Answers:


216

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

我创建了一个新方法:

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代码并从ajax传递值的php(method:delete)进行ajax调用吗?
user1788736 2013年

@ user1788736我不太擅长Ajax,但我想您可以创建一个执行此方法的PHP文件,并使用Ajax使用POST将数据发送到该PHP文件。如果您认为上述方法令人困惑,请再次查看。$ url只是您需要与之对话的服务器(someserver.com),而$ path是URL(/ something /)之后的内容。我将它们分开的唯一原因是,我需要一直发送到同一服务器,但要使用动态路径。希望有道理。
博利

不需要标题吗?
er.irfankhan11年

我正在使用相同的代码,并且Paypal返回http代码:204,表示删除成功。但我一直都收到400。
er.irfankhan11年

1
@kuttoozz是我班上的一个私有变量。这只是您需要发出请求的URL。可能类似于api.someurl.com,而$ path是该URL(/ something /)之后的内容。您可以简单地将该值更改为URL或将其删除,并将完整的URL包括在$ path变量中。那有意义吗?
博利

19

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

做得好。请注意:delete的http响应代码为204。我认为您应该将所有20x代码都视为良好的响应:)
ryuujin19年

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

使用+ = instaead of array_merge
Adriwan Kenoby

这可能有效,但是对于该问题而言却是不必要的复杂解决方案。
塞缪尔·林德布鲁姆

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 2012年

$json empty是什么意思?无论如何,它不在此函数的作用域内,因此使用no $json不会做任何事情。
Halfer '17

我要求删除此答案,但主持人说不。该答案的发布者自2014年以来一直未登录。
Halfer '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.