如何重置CURLOPT_CUSTOMREQUEST

时间:2010-11-12 10:49:28

标签: php rest curl

我正在使用REST API,除其他外,它使用DELETE方法,如下所示:

DELETE /resources/whatever/items/123

要使用PHP访问它,我正在使用这样的cURL:

self::$curl = curl_init();
curl_setopt_array(self::$curl, array(
    CURLOPT_AUTOREFERER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true,
));

如您所见,我的cURL实例是静态的,将在后续调用中重用。在“内置”请求方法之间切换时,这可以正常工作。例如,在我的get()方法中,我做了类似的事情:

curl_setopt_array(self::$curl, array(
    CURLOPT_HTTPGET => true,
    CURLOPT_URL => self::BASE . 'whatever',
));

然后运行curl_exec()。通过CURLOPT_HTTPGET明确设置请求方法,将清除可能的先前CURLOPT_POST

但是,设置CURLOPT_CUSTOMREQUEST(例如设置为DELETE)将覆盖任何其他内置请求方法。只要我想要DELETE事情就行了,但是调用例如curl_setopt(self::$curl, CURLOPT_HTTPGET, true)将不会重置自定义方法; <{1}}仍会被使用。

我已尝试将DELETE设置为CURLOPT_CUSTOMREQUESTnull或空字符串,但这只会导致HTTP请求,例如

false

即。使用空字符串作为方法,后跟空格,后跟路径。

我知道我可以将 /resources/whatever/items/123 设置为CURLOPT_CUSTOMREQUEST并执行GET请求而不会有任何问题,但我想知道是否有可能重置GET

2 个答案:

答案 0 :(得分:13)

这实际上是PHP中的a bug,因为原来的documentation声明如下:

  

通过将此设置为NULL恢复为内部默认值。

不幸的是,正如您在the source code中看到的那样,选项值在传递给底层库之前会被转换为字符串。

解决方案

我写了pull request来解决问题,并允许NULL选项值传递CURLOPT_CUSTOMREQUEST

以上补丁需要一段时间才能合并到项目中,因此在您开始使用此选项之前,您必须自己明确设置该方法。

更新

修复程序已应用于5.5.11和5.6.0(beta1)。

答案 1 :(得分:0)

将CURLOPT_CUSTOMREQUEST设置为NULL并将CURLOPT_HTTPGET设置为TRUE以重置为普通GET。