【发布时间】:2010-10-09 02:57:22
【问题描述】:
当我指定要作为 cURL 选项发布的数据数组时(通过 CURLOPT_POSTFIELDS),我需要先对数据进行 urlencode 还是会处理?
【问题讨论】:
当我指定要作为 cURL 选项发布的数据数组时(通过 CURLOPT_POSTFIELDS),我需要先对数据进行 urlencode 还是会处理?
【问题讨论】:
curl_setopt 的 C 实现似乎没有对文本进行 URL 编码。但是,在 PHP5 中,http_build_query 函数返回 URL 编码的数组的查询字符串表示形式。
$curl_parameters = array(
'param1' => $param1,
'param2' => $param2
);
$curl_options = array(
CURLOPT_URL => "http://localhost/service",
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query( $curl_parameters ),
CURLOPT_HTTP_VERSION => 1.0,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false
);
$curl = curl_init();
curl_setopt_array( $curl, $curl_options );
$result = curl_exec( $curl );
curl_close( $curl );
【讨论】:
您不必先进行 urlencode。然而,重要的是要意识到传递一个数组会使 cURL 将它作为multipart/form-data 发送,这解释了为什么它不需要进行 urlencoded(你和 cURL 都不是),如果你需要,你需要使用一个数组上传文件。如果您首先http_build_query()(并将其作为字符串发送),它将被视为application/x-www-form-urlencoded。
【讨论】:
multipart/form-data。
application/x-www-form-urlencoded,所以我使用标题手动设置它,但后来找到了这个答案。更喜欢。 PHP.net 为此添加了一个通知,但在示例下方很多人没有看到它。 php.net/manual/en/…
为 CURLOPT_POSTFIELDS 使用数组的一个问题是您不能有一个空值的名称-值对。
【讨论】:
我用:
curl_setopt($curl , CURLOPT_POSTFIELDS, $array );
代替:
curl_setopt($curl , CURLOPT_POSTFIELDS, http_build_query($array) );
【讨论】:
POST 数据未添加到 URL(如 GET),因此您无需对其进行 URL 编码。
【讨论】: