20

当我分配要作为 cURL 选项发布的数据数组时(通过 CURLOPT_POSTFIELDS),我是否需要先对该数据进行 urlencode 或将其处理?

4

5 回答 5

31

的 C 实现curl_setopt似乎没有对文本进行 URL 编码。但是,在 PHP5 中,该函数返回URL 编码的数组http_build_query查询字符串表示形式。

示例用法

  $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 );
于 2009-02-22T03:18:38.580 回答
14

您不必先进行 urlencode。但是,重要的是要意识到传递一个数组会使 cURL 将其发送为multipart/form-data,这就解释了为什么它不需要进行 urlencoded(你和 cURL 都不是),如果你想上传文件,你需要使用一个数组. 如果您http_build_query()首先(并将其作为字符串发送),它将被视为application/x-www-form-urlencoded.

于 2009-02-22T04:10:48.610 回答
1

为 CURLOPT_POSTFIELDS 使用数组的一个问题是您不能有一个空值的名称-值对。

于 2009-02-22T13:56:01.090 回答
1

我用:

curl_setopt($curl , CURLOPT_POSTFIELDS, $array );

代替:

curl_setopt($curl , CURLOPT_POSTFIELDS, http_build_query($array)  );
于 2017-11-22T07:47:51.923 回答
0

POST 数据不会添加到 URL(如 GET),因此您不需要对其进行 URL 编码。

于 2009-02-22T04:12:04.053 回答