最近httpプロトコルを勉強中です! http プロトコルをよりよく理解するために、nodejs の http モジュールを調べてみました。かなり得した気分です。たとえば、http リクエストを使用してリクエストを送信します。
var options = { host: 'localhost', port: 80, path: '/backbone/data.php', method: 'POST'};var req = http.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); });});// write data to request bodyreq.end('name=liuzhang&age=28');
上記のコードは、データ 'name=liuzhang&age=28' を送信することを意味し、コールバックは応答オブジェクトであり、サーバーから応答されたデータを出力します。
data.php コードは
print_r($_POST);
渡されたデータを出力します!
コマンドラインで実行した結果は
配列が空である、つまり $_POST にデータがないことがわかります。最初はデータが送信されていないのかと思いました。しかし、バックエンドの data.php を
echo file_get_contents("php://input");
に変更して、渡されたデータを受け取りました。
php://input は、要求された生データへのアクセスを提供する読み取り専用ストリームです。 POST リクエストの場合、特定の php.ini ディレクティブに依存しないため、$HTTP_RAW_POST_DATA の代わりに php://input を使用することをお勧めします。 また、この場合、$HTTP_RAW_POST_DATA はデフォルトでは設定されないため、always_populate_raw_post_data をアクティブにするよりも必要なメモリが少なくなる可能性があります。 enctype="multipart/form-data"を使用した場合、php://inputは無効となります。
$_POST は、application/x-www-form-urlencoded タイプに従ってデータが送信された場合にのみ取得できます。 form の enctype 属性は、一般的に使用される 2 つのメソッドです: application/x-www-form。 -urlencoded および multipart/form-data、デフォルトは application/x-www-form-urlencoded です。 アクションが get の場合、ブラウザーは x-www-form-urlencoded エンコーディング メソッドを使用してフォーム データを文字列 (name1=value1&name2=value2...) に変換し、その文字列を URL の末尾に追加します。 ? で分割し、この新しい URL をロードします。 アクションがポストされると、ブラウザーはフォーム データを http 本文にカプセル化し、それをサーバーに送信します。
送信オプションを
var options = { host: 'localhost', port: 80, path: '/backbone/data.php', method: 'POST', headers : {'Content-Type': 'application/x-www-form-urlencoded'}};
headers content-type を追加すると、$_POST を使用してデータを受信できるようになります。 このフォーム タイプでない場合は、生の入力を使用してデータを受信できます。