curl POST格式为CURLOPT_POSTFIELDS

当我通过POST使用curl并设置CURLOPT_POSTFIELD ,是否需要urlencode或任何特殊的格式?

例如:如果我想发布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); 

如果你正在发送一个string,urlencode()它。 否则,如果数组,它应该是key =>值配对,并且Content-type头部自动设置为multipart/form-data

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

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

编辑 :从php5向上,build议使用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”操作中发布。 要发布文件,请使用@预先指定文件名并使用完整path。 文件types可以通过跟随具有格式'; type = mimetype'格式的文件名来显式指定。 此参数可以作为urlencodedstring(如'para1 = val1&para2 = val2&…')传递,也可以作为字段名称作为键和字段数据作为值的数组传递。 如果value是一个数组,则Content-Type头将被设置为multipart / form-data。 从PHP 5.2.0开始,使用@前缀传递给此选项的文件必须以数组forms工作。

所以像这样的东西应该完美地工作(parameter passing在关联数组中):

 function preparePostFields($array) { $params = array(); foreach ($array as $key => $value) { $params[] = $key . '=' . urlencode($value); } return implode('&', $params); } 

根本不要传递string!

你可以通过一个数组,让PHP /curl做编码等肮脏的工作

根据PHP手册,作为string传递给cURL的数据应该被URL编码。 查看curl_setopt()的页面并searchCURLOPT_POSTFIELDS

对于CURLOPT_POSTFIELDS ,可以将参数作为urlencodedstring(如para1=val1&para2=val2&..或以字段名称作为键并将字段数据作为值

尝试以下格式:

 $data = json_encode(array( "first" => "John", "last" => "Smith" )); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $output = curl_exec($ch); curl_close($ch); 

这个答案带我永远find。 我发现你所要做的就是将URL(文件名和扩展名之后的“?”)与URL编码的查询string连接起来。 它甚至不像你必须设置POST cURL选项。 看到下面的假示例:

 //create URL $exampleURL = 'http://www.example.com/example.php?'; // create curl resource $ch = curl_init(); // build URL-encoded query string $data = http_build_query( array('first' => 'John', 'last' => 'Smith', '&'); // set url curl_setopt($ch, CURLOPT_URL, $exampleURL . $data); // return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); // close curl resource to free up system resources <br/> curl_close($ch); 

你也可以使用file_get_contents()

 // read entire webpage file into a string $output = file_get_contents($exampleURL . $data);