用于CURLOPT_POSTFIELDS的卷曲 POST 格式

2022-08-30 07:18:27

当我使用 via 和 set 时,我必须使用或任何特殊格式?curlPOSTCURLOPT_POSTFIELDurlencode

例如:如果我想发布2个字段,第一个和最后一个:

first=John&last=Smith

应该与curl一起使用的确切代码/格式是什么?

$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);

答案 1

如果你要发送一个字符串,urlencode()它。否则,如果是数组,则应将其设置为 key=>value 配对,并且标头自动设置为 。Content-typemultipart/form-data

此外,您不必创建额外的函数来为数组构建查询,您已经拥有:

$query = http_build_query($data, '', '&');

答案 2

编辑:从php5开始,建议使用http_build_query

string http_build_query ( mixed $query_data [, string $numeric_prefix [, 
                          string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

手册中的简单示例:

<?php
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

echo http_build_query($data) . "\n";

/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/

?>

在 php5 之前:

手册中:

CURLOPT_POSTFIELDS

要在 HTTP“POST”操作中发布的完整数据。要发布文件,请在文件名前面加上 @ 并使用完整路径。文件名后面带有格式为“;type=mimetype”的类型,可以显式指定文件类型。此参数可以作为 urlencoded 字符串传递,如 'para1=val1&para2=val2&...'或作为数组,其中字段名称作为键,字段数据作为值。如果 value 是数组,则 Content-Type 标头将设置为多部分/表单数据。从 PHP 5.2.0 开始,传递给此选项的 @ 前缀文件必须采用数组形式才能工作。

所以这样的东西应该可以完美地工作(参数在关联数组中传递):

function preparePostFields($array) {
  $params = array();

  foreach ($array as $key => $value) {
    $params[] = $key . '=' . urlencode($value);
  }

  return implode('&', $params);
}

推荐