我使用的是 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)
不会重置自定义方法; DELETE
仍将被使用。
我尝试将 CURLOPT_CUSTOMREQUEST
设置为 null
、false
或空字符串,但这只会导致 HTTP 请求,例如
/resources/whatever/items/123
即使用空字符串作为方法,后跟一个空格,然后是路径。
我知道我可以将 CURLOPT_CUSTOMREQUEST
设置为 GET
并毫无问题地执行 GET 请求,但我想知道是否有可能重置 CURLOPT_CUSTOMREQUEST
.
最佳答案
这实际上是a bug在 PHP 中,自原始 documentation声明如下:
Restore to the internal default by setting this to NULL.
不幸的是,正如您从 the source code 中看到的那样,选项值在传递到底层库之前会被转换为字符串。
解决方案
我写了一个pull request它解决了该问题并允许为 CURLOPT_CUSTOMREQUEST
选项值传递 NULL
。
上述补丁需要一些时间才能合并到项目中,因此在此之前,一旦开始使用此选项,您就必须自己显式设置该方法。
更新
该修复已应用于 5.5.11 和 5.6.0 (beta1)。
关于php - 如何重置 CURLOPT_CUSTOMREQUEST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163865/