它说浏览器发送了服务器无法理解的请求..我不完全理解我的PHP代码出了什么问题。有人可以帮我理解我哪里出错了。谢谢!
<?php
$url ="http://127.0.0.1/sensor/sens/data.php";
$xml_data = file_get_contents("/usr/local/www/data/data.xml");
$header ="POST HTTP/1.0 \r\n";
$header .="Content-type: text/xml \r\n";
$header .="Content-length: ".strlen($xml_data)." \r\n";
$header .="Content-transfer-encoding: text\r\n";
$header .="Connection: close \r\n\r\n";
$header .= $xml_data;
$ch = curl_init();
curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$header);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
$data = curl_exec($ch); // if the post is successful , the server will return some data.
echo $data;
#$info = curl_getinfo($ch);
#
#if(!curl_errno($ch))
# echo 'It took '.$info['total_time'].'seconds to send a request to'.$info['url'];
#
# else
#
curl_close($ch);
echo $data;
?>
答案 0 :(得分:0)
我认为问题出在CURLOPT_POSTFIELDS
来自PHP手册......
要在HTTP“POST”操作中发布的完整数据。要发布文件,请在文件前加上@并使用完整路径。可以通过使用格式为'; type = mimetype'的类型的文件名来明确指定文件类型。此参数可以作为urlencoded字符串传递,如'para1 = val1&amp; para2 = val2&amp; ...',或者作为一个数组,字段名称为键,字段数据为值。如果value是数组,则Content-Type标头将设置为multipart / form-data。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则值必须是数组。
http://php.net/manual/en/function.curl-setopt.php
它应仅包含有效负载,而不是整个标头。
答案 1 :(得分:0)
您不需要使用cURL创建自定义请求来发出此请求,常规HTTP POST就足够了。问题的另一部分是您还将POSTFIELDS
和自定义请求设置为您构造的HTTP请求的相同内容,因此整个请求主要包含两个重复的字符串。
尝试使用此代码并对其进行研究以了解其工作原理:
<?php
$url = "http://127.0.0.1/sensor/sens/data.php";
$xml_data = file_get_contents("/usr/local/www/data/data.xml");
$headers = array('Content-Type: text/xml',
'Content-Transfer-Encoding: text',
'Connection: close');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
$data = curl_exec($ch); // if the post is successful , the server will return
// some data.
echo $data;
// info = curl_getinfo($ch);
//
// f(!curl_errno($ch))
// echo 'It took '.$info['total_time'].'seconds to send a request
// to'.$info['url'];
//
// else
//
curl_close($ch);
echo $data;