看起来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
,则可以正常工作。
为什么会这样?
答案 0 :(得分:2)
当您指定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)。
其他示例有效,因为一旦设置了数据,您就不会更改类型。