【问题标题】:How to send array with CURL? Should I `urlencode` it?如何使用 CURL 发送数组?我应该对其进行“urlencode”吗?
【发布时间】:2010-10-09 02:57:22
【问题描述】:

当我指定要作为 cURL 选项发布的数据数组时(通过 CURLOPT_POSTFIELDS),我需要先对数据进行 urlencode 还是会处理?

【问题讨论】:

    标签: php post curl urlencode


    【解决方案1】:

    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 );
    

    【讨论】:

    • 如果你传递一个数据字符串,它只说明 urlencoded 部分,而没有说明你是否需要对数组进行预编码。
    • 小心 http_build_query(),当你发布一个文件时,它会破坏'@'符号。
    【解决方案2】:

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

    【讨论】:

    • 它不会对它们进行urlencode,因为它是以多部分形式发送的,所以没有必要。
    • 我知道,但是规范并没有说明如果通过了一个数组就生成一个multipart/form-data
    • 没错,文档很松散。我必须自己通过嗅探数据包来解决这个问题,我认为它也在 cmets 中的某个地方(@the PHP doc)。由于要上传文件必须传递数组,所以无论如何,多部分是唯一的方法。
    • 尽管是一个老话题,但我发现这个答案很有帮助。我连接的端点只允许application/x-www-form-urlencoded,所以我使用标题手动设置它,但后来找到了这个答案。更喜欢。 PHP.net 为此添加了一个通知,但在示例下方很多人没有看到它。 php.net/manual/en/…
    【解决方案3】:

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

    【讨论】:

    • 我遇到了同样的问题,我有一个有时可以为空的数组,所以当它为空时,它根本不会发送该数组的密钥。
    【解决方案4】:

    我用:

    curl_setopt($curl , CURLOPT_POSTFIELDS, $array );
    

    代替:

    curl_setopt($curl , CURLOPT_POSTFIELDS, http_build_query($array)  );
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 错了,如果作为字符串传递给curl_setopt函数,需要编码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2013-03-18
      • 2011-08-20
      • 2020-04-03
      相关资源
      最近更新 更多