-1

它说浏览器发送了一个服务器无法理解的请求。我不完全理解我的 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;







    ?>
4

2 回答 2

0

我认为问题在于CURLOPT_POSTFIELDS

从 PHP 手册...

在 HTTP“POST”操作中发布的完整数据。要发布文件,请在文件名前加上 @ 并使用完整路径。文件类型可以通过使用格式为“;type=mimetype”的文件名来明确指定。此参数可以作为 urlencoded 字符串(如 'para1=val1¶2=val2&...')或作为字段名称作为键和字段数据作为值的数组传递。如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data。从 PHP 5.2.0 开始,如果文件以 @ 前缀传递给此选项,则 value 必须是数组。

http://php.net/manual/en/function.curl-setopt.php

它应该只保存有效负载,而不是整个标头。

于 2012-10-18T21:39:04.643 回答
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;
于 2012-10-18T21:40:25.790 回答