如果使用curl_setopt_array设置CURLOPT_POST,PHP curl会重置内容长度吗?

时间:2011-11-02 11:52:41

标签: php curl

看起来curl_setopt_arraycurl_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,则可以正常工作。

为什么会这样?

1 个答案:

答案 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)。

其他示例有效,因为一旦设置了数据,您就不会更改类型。