Как переключиться с 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.


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 используется по умолчанию, это необходимо только в том случае, если метод запроса был изменен.


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');

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.