node.js POST请求失败

时间:2011-06-02 23:56:57

标签: php post curl node.js request

我正在尝试使用node.js执行POST请求,但似乎总是超时。我也尝试用PHP中的cURL做请求,以确保并且工作正常。此外,在我的本地服务器(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 );
    }
?>

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

您正在将标头传递给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();