php - 如何重置 CURLOPT_CUSTOMREQUEST

标签 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) 不会重置自定义方法; DELETE 仍将被使用。

我尝试将 CURLOPT_CUSTOMREQUEST 设置为 nullfalse 或空字符串,但这只会导致 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/

相关文章:

php - 如何在foreach循环下将数组合并为一个数组

php - Laravel 4使用eloquent创建记录时无法保存created_at字段

rest - 如果我使用 HTTP 方法 POST 来获取数据是否有效?

php - 'put'方法无法读取REST请求数据

php - AWS SSL 安全错误 : [curl] 60: SSL certificate prob. ..:无法获取本地颁发者证书

bash - 使用多行 JSON 进行 curl

php - 如何在MySQL查询中对同一张表同时执行插入和选择操作?

php - 在域指向的地方之外引用公共(public)文件

asp.net - Azure 物联网中心设备与后端的云通信

javascript - 使用 Firefox 访问 Restdb.io API 时收到错误