Как переключиться с POST на GET в PHP CURL

83

Я попытался переключиться с предыдущего запроса Post на запрос Get. Предполагается, что это Get, но в конечном итоге создается сообщение.

Я пробовал в PHP следующее:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null);
curl_setopt($curl_handle, CURLOPT_POST, FALSE);
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE);

Что мне не хватает?

Дополнительная информация: у меня уже есть соединение, настроенное для выполнения запроса POST. Это завершается успешно, но позже, когда я пытаюсь повторно использовать соединение и переключаться обратно на GET, используя указанные выше настройки, он все равно выполняет внутренний POST с неполными заголовками POST. Проблема в том, что он считает, что выполняет GET, но в итоге помещает заголовок POST без параметра длины содержимого, и соединение не выполняется с 411 ERROR.

gnosio
источник
3
Будьте осторожны с запросами Get. Google весело с ними. ;)
NotMe 04
10
@Chris - друг обнаружил это на собственном горьком опыте, когда создал сайт, который управлял контентом, добавленным пользователями, с помощью запросов GET. Робот Googlebot с радостью перешел по всем ссылкам «удалить» с предсказуемыми результатами.
Мередит Л. Паттерсон

Ответы:

109

Убедитесь, что вы помещаете строку запроса в конец URL-адреса при выполнении запроса GET.

$ qry_str = "? x = 10 & y = 20";
$ ch = curl_init ();

// Устанавливаем здесь данные запроса с URL
curl_setopt ($ ch, CURLOPT_URL, 'http://example.com/test.php'. $ qry_str); 

curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ ch, CURLOPT_TIMEOUT, 3);
$ content = trim (curl_exec ($ ch));
curl_close ($ ch);
print $ content;
С помощью POST вы передаете данные через параметр CURLOPT_POSTFIELDS вместо 
передачи его в CURLOPT__URL.
-------------------------------------------------- -----------------------

$ qry_str = "х = 10 и у = 20";
curl_setopt ($ ch, CURLOPT_URL, 'http://example.com/test.php');  
curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ ch, CURLOPT_TIMEOUT, 3);

// Устанавливаем метод запроса на POST
curl_setopt ($ ch, CURLOPT_POST, 1);

// Устанавливаем здесь данные запроса с помощью CURLOPT_POSTFIELDS
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ qry_str);

$ content = trim (curl_exec ($ ch));
curl_close ($ ch);
print $ content;

Примечание из curl_setopt()документации для CURLOPT_HTTPGET(выделено мной):

[Установите CURLOPT_HTTPGET равным], TRUEчтобы сбросить метод HTTP-запроса на GET.
Поскольку GET используется по умолчанию, это необходимо только в том случае, если метод запроса был изменен.

RC.
источник
3
Это довольно злой способ установить тайм-аут в 51 секунду!
Джек Гуссен
Хороший улов @JackGoossen!
RC.
55

Добавьте это перед вызовом curl_exec ($ curl_handle)

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');
Бао Ле
источник
39

Решено: проблема заключается в следующем:

Я установил POSTчерез оба _CUSTOMREQUESTи, _POSTи _CUSTOMREQUESTсохранялось, как POSTпри _POSTпереключении на _HTTPGET. Сервер предположил, что заголовок от _CUSTOMREQUESTбыл правильным, и вернулся с 411.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST');
gnosio
источник
3

Запрос CURL по умолчанию - GET, вам не нужно устанавливать какие-либо параметры, чтобы сделать запрос GET CURL.

Альбертино Карвалью
источник