-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

このリクエストを行うためにcURLを使用してカスタムリクエストを作成する必要はありません。通常のHTTPPOSTで十分です。問題のもう1つの部分は、POSTFIELDSカスタムリクエストを作成したHTTPリクエストと同じものに設定しているため、リクエスト全体が主に2つの重複する文字列で構成されていることです。

このコードを試して、それがどのように機能するかを理解するためにそれを研究してください:

<?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 に答える
0

問題はCURLOPT_POSTFIELDS

PHPマニュアルから...

HTTP「POST」操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の前に@を付け、フルパスを使用します。ファイル名の後に「;type= mimetype」の形式のタイプを付けることにより、ファイルタイプを明示的に指定できます。このパラメーターは、「para1 = val1&para2 = val2&...」のようなurlencoded文字列として、またはフィールド名をキーとして、フィールドデータを値として持つ配列として渡すことができます。値が配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。PHP 5.2.0以降、ファイルが@プレフィックスを付けてこのオプションに渡される場合、値は配列である必要があります。

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

ヘッダー全体ではなく、ペイロードのみを保持する必要があります。

于 2012-10-18T21:39:04.643 に答える