Как сбросить CURLOPT_CUSTOMREQUEST - PullRequest
       4

Как сбросить CURLOPT_CUSTOMREQUEST

13 голосов
/ 12 ноября 2010

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

Ответы [ 3 ]

13 голосов
/ 18 ноября 2013

Это на самом деле ошибка в PHP, поскольку оригинальная документация гласит следующее:

Восстановите внутреннее значение по умолчанию, установив для него значение NULL.

К сожалению, как видно из исходного кода , значение параметра передается в строку перед передачей в базовую библиотеку.

Решение

Я написал запрос на получение , который решает проблему и позволяет передать NULL для значения параметра CURLOPT_CUSTOMREQUEST.

Приведенный выше патч займет некоторое время для объединения с проектом, поэтому до тех пор, пока вы не начнете использовать эту опцию, вам придется явно установить метод самостоятельно.

Обновление

Исправление было применено к 5.5.11 и 5.6.0 (бета1).

0 голосов
/ 11 мая 2018

(пожимает плечами ...) И то, что я закончил делать в своем API, - это просто "устанавливать его каждый раз".Моя подпрограмма POST просто устанавливает настраиваемый заголовок "POST" и так далее.Прекрасно работает.

Я обнаружил, что, как только вы установите настраиваемый заголовок, он "залипает".Будущие вызовы, которые затем пытаются сделать обычные GET, POST, PUT, начинают терпеть неудачу.Я экспериментировал с предложениями, перечисленными ранее в этом посте (с PHP-7), , и не очень быстро добился успеха ... так: "черт возьми, это не элегантно,но это работает. "

0 голосов
/ 10 мая 2011

Установите CURLOPT_CUSTOMREQUEST в NULL и CURLOPT_HTTPGET в TRUE, чтобы вернуться к обычному GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...