1

私はnode.jsにそのようなコードを持っています:

var requestData = JSON.stringify({ id : data['user_id'] });
var options = {
    hostname: 'localhost',
    port: 80,
    path: '/mypath/index.php',
    method: 'POST',
    headers: {
        "Content-Type": "application/json",
        'Content-Length': requestData.length
    }
};

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);
    });
});

req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

// write data to request body
req.write(requestData); 
req.end();

および PHP コード:

<?php
    $data = $_POST;
    define('DS', '/');
    umask(000);
    file_put_contents(dirname( __FILE__ ).DS.'log.txt', json_encode($data), FILE_APPEND);
    echo json_encode($data);
?>

非常に単純です...しかし、node.js POSTリクエストを作成した後、PHPはデータを取得していません。その POST メッセージを PHP に作成する他の多くの方法を試しましたが、何もうまくいきません。$_POSTつまり、常に空です。

nodejsライブラリもリクエストしてみました:

    request.post({
        uri : config.server.protocol + '://localhost/someurl/index.php',
        json : JSON.stringify({ id : data['user_id'] }),
        },
        function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log('returned BODY:', body);
        }
        def.resolve(function() {
            callback(error);
        });
    });

私の問題には本当に簡単な解決策があるはずですが、見つかりません。

4

1 に答える 1

3

配列には、$_POSTHTML フォームの POST 送信のみが取り込まれます。このようなフォーム送信をエミュレートするには、次のことを行う必要があります。

  • リクエストの Content-Type ヘッダーを正確に設定しますapplication/x-www-form-urlencoded
  • リクエスト本文でフォーム エンコーディングを使用します...必要に応じkey=value&key2=value2パーセントエンコーディングを使用した IE。
  • Content-Length ヘッダーの値を、送信されるバイトの長さに正確に計算します。urlencoded 文字列では 1 文字 = 1 バイトであるため、Content-Length を計算するためにバイト変換は必要ありませんが、完全にエンコードされた文字列を取得した後にのみこれを行うことができます。

ただし、現在のコード (ASCII しかない場合) では、次のこともできます。

<?php
    $data = json_decode(file_get_contents("php://input"));
    $error = json_last_error();
    if( $error !== JSON_ERROR_NONE ) {
        die( "Malformed JSON: " . $error );
    }

    define('DS', '/');
    umask(000);
    file_put_contents(dirname( __FILE__ ).DS.'log.txt', json_encode($data), FILE_APPEND);
    echo json_encode($data);
?>
于 2013-02-03T12:56:56.840 に答える