【问题标题】:PHP curl resets content-length if CURLOPT_POST is set with curl_setopt_array?如果使用 curl_setopt_array 设置 CURLOPT_POST,PHP curl 会重置内容长度?
【发布时间】:2011-11-02 20:03:52
【问题描述】:

看起来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_POSTFIELDS 之后设置CURLOPT_POST,似乎内容长度会被重置。除非使用curl_setopt 而不是curl_setopt_array 设置它可以正常工作。

这是为什么?

【问题讨论】:

  • 出色的工作追踪了这一点。现在我可以不再用头撞墙,而是通过 Facebook 的 API 上传照片。

标签: php curl


【解决方案1】:

当您指定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)。

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

【讨论】:

  • 但是当我对curl_setopt(最后一个例子)做同样的事情时,为什么它会起作用?
  • 因为两个选项都将类型设置为application/x-www-form-urlencoded,所以数据不会丢失
  • 哦,我明白了,我的错。在这一点上,我认为最好完全省略CURLOPT_POST,数据类型将根据帖子字段设置。对吗?
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2018-01-22
  • 2016-07-12
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多