Я использую 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_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 .
На самом деле это ошибка в PHP, поскольку в исходной документации указано следующее:
Восстановите внутреннее значение по умолчанию, установив для этого значение NULL.
К сожалению, как вы можете видеть из исходного кода , значение параметра передается в строку до того, как оно будет передано в базовую библиотеку.
Я написал запрос на CURLOPT_CUSTOMREQUEST который решает проблему, и позволяет передавать NULL для CURLOPT_CUSTOMREQUEST параметра CURLOPT_CUSTOMREQUEST .
Вышеупомянутый патч займет некоторое время, чтобы объединиться в проект, поэтому до тех пор вам придется явно установить метод самостоятельно, как только вы начнете использовать этот параметр.
Исправление было применено к 5.5.11 и 5.6.0 (beta1).
Установите CURLOPT_CUSTOMREQUEST в NULL и CURLOPT_HTTPGET в TRUE, чтобы вернуться к обычным GET.