php - formdata - request node js post body json



node.js POST請求失敗 (1)

我試圖用node.js執行一個POST請求,但似乎總是超時。 我也嘗試使用cURL在PHP中的請求,只是為了確保和工作正常。 另外,在本地服務器(127.0.0.1)而不是遠程服務器上執行完全相同的請求時,它也可以很好地工作。

Node.js的:

var postRequest = {
    host: "www.facepunch.com",
    path: "/newreply.php?do=postreply&t=" + threadid,
    port: 80,
    method: "POST",
    headers: {
        Cookie: "cookie",
        'Content-Type': 'application/x-www-form-urlencoded'
    }
};
buffer = "";

var req = http.request( postRequest, function( res )
{
    console.log( res );
    res.on( "data", function( data ) { buffer = buffer + data; } );
    res.on( "end", function() { require( "fs" ).writeFile( "output.html", buffer ); } );
} );

var body = "postdata\r\n";
postRequest.headers["Content-Length"] = body.length;
req.write( body );
req.end();

cURL和PHP

<?php
    if ( $_SERVER["REMOTE_ADDR"] == "127.0.0.1" )
    {
        $body = "body";

        $ch = curl_init();

        curl_setopt( $ch, CURLOPT_URL, "http://www.facepunch.com/newreply.php?do=postreply&t=" . $threadid );
        curl_setopt( $ch, CURLOPT_POST, 15 );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $body );
        curl_setopt( $ch, CURLOPT_COOKIE, "cookie" );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

        $result = curl_exec( $ch );

        curl_close( $ch );
    }
?>

這裡發生了什麼?


您將標頭傳遞給http請求調用,然後嘗試在事實之後添加Content-Length標頭。 在傳遞值之前,你應該這樣做,因為它改變了http請求設置的方式Transfer-Encoding

var body = "postdata";

var postRequest = {
    host: "www.facepunch.com",
    path: "/newreply.php?do=postreply&t=" + threadid,
    port: 80,
    method: "POST",
    headers: {
        'Cookie': "cookie",
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(body)
    }
};

var buffer = "";

var req = http.request( postRequest, function( res )
{
    console.log( res );
    res.on( "data", function( data ) { buffer = buffer + data; } );
    res.on( "end", function() { require( "fs" ).writeFile( "output.html", buffer ); } );
} );

req.write( body );
req.end();




request