Похоже, curl_setopt_array
отличается от нескольких вызовов curl_setopt
. Рассмотрим этот скрипт:
$ch = curl_init('http://www.stackoverflow.com/'); [options] curl_exec($ch); var_dump(curl_getinfo($ch));
Теперь он отправляет правильный запрос, если [options]
являются одним из следующих:
curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_POSTFIELDS => array('a' => 'b'), ));
или
curl_setopt_array($ch, array( CURLOPT_POSTFIELDS => array('a' => 'b'), ));
или
curl_setopt($ch, CURLOPT_POSTFIELDS, 'a=b'); curl_setopt($ch, CURLOPT_POST, 1);
НО НЕ:
curl_setopt_array($ch, array( CURLOPT_POSTFIELDS => array('a' => 'b'), CURLOPT_POST => true, ));
Кажется, что длина контента сбрасывается, если CURLOPT_POST
устанавливается после CURLOPT_POSTFIELDS
. За исключением того, что он работает нормально, если задано с curl_setopt
вместо curl_setopt_array
.
Почему это?
Когда вы указываете CURLOPT_POST
, сообщение отправляется как application/x-www-form-urlencoded
.
Но, с справочной страницы curl_setopt
:
Передача массива в CURLOPT_POSTFIELDS будет кодировать данные как multipart / form-data, в то время как передача строки с кодировкой URL будет кодировать данные как application / x-www-form-urlencoded.
Поэтому, когда вы делаете
curl_setopt_array($ch, array( CURLOPT_POSTFIELDS => array('a' => 'b'), // multipart/form-data CURLOPT_POST => true, // application/x-www-form-urlencoded ));
Данные устанавливаются как mulpart/form-data
(путем установки CURLOPT_POSTFIELDS
в массив), а затем сбрасываются как application/x-www-form-urlencoded
(путем установки CURLOPT_POST
в true).
Другие примеры работают, потому что вы не меняете тип после установки данных.