php + curl не может установить метод записи - PullRequest
2 голосов
/ 28 февраля 2012

Я пытаюсь сделать почтовый запрос с php и curl. Вот мой код

//PHP 5.3.5 and curl: 7.18.2
$ch = curl_init();
if(!empty($save_cookie)){
    curl_setopt($ch, CURLOPT_COOKIEJAR, $save_cookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $save_cookie);
}else{
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}

curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_URL, 'http://localhost/post.php');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_NOBODY, !$body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$postResult = curl_exec($ch);

if (curl_errno($ch)) {
    return false;
}

curl_close($ch);
return $postResult;

В http://localhost/post.php, пишу

print_r($_SERVER);

Результат возврата curl всегда равен

[REQUEST_METHOD] => GET

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Попробуйте переместить линию

curl_setopt($ch, CURLOPT_NOBODY, !$body);

прямо перед строкой

curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);

.

Естьинтересный пост на странице curl / set_opt , который проливает некоторый свет на это поведение:

Если ваши данные POST исчезают (данные POST пусты, запрос обрабатываетсясервер как GET), попробуйте изменить порядок настройки CURLOPT_POSTFIELDS с помощью CURLOPT_NOBODY.CURLOPT_POSTFIELDS должен появиться после установки CURLOPT_NOBODY, потому что, если это происходит после того, как он удаляет заголовок, который сообщает вашей цели URL, что запрос является POST, а не GET.

2 голосов
/ 28 февраля 2012

Удалите параметр CURLOPT_NOBODY, и он будет работать. Или поместите его выше линии CURLOPT_POST.

Я думаю, что однажды столкнулся с этим, когда пытался получить только заголовок ответа. Установка

curl_setopt($ch, CURLOPT_NOBODY, true);

эффективно инструктирует curl о выдаче запроса HEAD, который не является запросом POST. Я думаю, что нет способа просто получить заголовок от POST (и просто сбросить соединение после получения заголовка). В качестве побочного эффекта установка CURLOPT_NOBODY на false устанавливает тип запроса на GET ...

Вам действительно нужен флаг CURLOPT_NOBODY?

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