Я использую 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.