如何重置CURLOPT_CUSTOMREQUEST

scy*_*scy 13 php rest curl

我正在使用REST API,除其他外,它使用这样的DELETE方法:

DELETE /resources/whatever/items/123
Run Code Online (Sandbox Code Playgroud)

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

self::$curl = curl_init();
curl_setopt_array(self::$curl, array(
    CURLOPT_AUTOREFERER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true,
));
Run Code Online (Sandbox Code Playgroud)

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

curl_setopt_array(self::$curl, array(
    CURLOPT_HTTPGET => true,
    CURLOPT_URL => self::BASE . 'whatever',
));
Run Code Online (Sandbox Code Playgroud)

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

但是,设置CURLOPT_CUSTOMREQUEST(例如DELETE)将覆盖任何其他内置请求方法.只要我想做的DELETE事情curl_setopt(self::$curl, CURLOPT_HTTPGET, true)就没问题,但是举例来说,不会重置自定义方法; DELETE仍然会被使用.

我曾尝试设置CURLOPT_CUSTOMREQUESTnull,false或空字符串,但这只会导致像一个HTTP请求

 /resources/whatever/items/123
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以设置CURLOPT_CUSTOMREQUESTGET代替并做GET没有任何问题的请求,但我不知道是否有重新成为了可能CURLOPT_CUSTOMREQUEST.

Ja͢*_*͢ck 13

这实际上 PHP中的一个错误,因为原始文档说明了以下内容:

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

不幸的是,正如您从源代码中看到的那样,选项值在传递给底层库之前会被转换为字符串.

我写了一个解决问题的pull请求,并允许NULL传递CURLOPT_CUSTOMREQUEST选项值.

上面的补丁需要一些时间才能合并到项目中,因此在您开始使用此选项之前,您必须自己显式设置该方法.

更新

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

  • @Scytale欢迎你.实际上,我自己也合并了公关;-) (2认同)