2012-09-06 279 views
3

我試圖通過PHP cURL發送一個post請求給我的node.js服務器,然後向客戶端發送消息。服務器運行和設置如下:用PHP cURL向Node.js發送Post請求

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs') 
    , qs = require('querystring') 

app.listen(8000); 

function handler(req, res) { 
    // set up some routes 
    switch(req.url) { 
     case '/push': 

     if (req.method == 'POST') { 
      console.log("[200] " + req.method + " to " + req.url); 
      var fullBody = ''; 

      req.on('data', function(chunk) { 
       fullBody += chunk.toString(); 

       if (fullBody.length > 1e6) { 
        // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST 
        req.connection.destroy(); 
       } 
      }); 

      req.on('end', function() {    
       // Send the notification! 
       var json = qs.stringify(fullBody); 
       console.log(json.message); 

       io.sockets.emit('push', { message: json.message }); 

       // empty 200 OK response for now 
       res.writeHead(200, "OK", {'Content-Type': 'text/html'}); 
       res.end(); 
      });  
     } 

     break; 

     default: 
     // Null 
    }; 
} 

和我的PHP如下:

$curl = curl_init(); 
    $data = array('message' => 'simple message!'); 

    curl_setopt($curl, CURLOPT_URL, "http://localhost:8000/push"); 
    curl_setopt($curl, CURLOPT_POST, 1); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

    curl_exec($curl); 

控制檯說,json.message是不確定的。爲什麼沒有定義?

+0

你爲什麼不加入的console.log(Fullbody中),看看你正在處理?我懷疑錯誤是身體不符合你的期望。 –

+0

謝謝隊友!剛剛解決了這個問題。 fullBody var現在按預期工作,所以json實際上應該= qs.parse(fullBody),而不是qs.stringify(fullBody)。 – Sneaksta

回答

1

您正在使用querystring.stringify()不正確。看到這裏的查詢字符串的方法的文檔:

http://nodejs.org/docs/v0.4.12/api/querystring.html

我相信你想要的東西是一樣的東西JSON.stringify()或querystring.parse(),而不是querystring.stringify(),它應該序列化將現有對象轉換爲查詢字符串;這與你正在做的事情相反。

你想要的是將你的fullBody字符串轉換成JSON對象的東西。

+0

完美運作!謝謝! – Sneaksta

1

如果你的身體只是包含JSON BLOB的字符串化版本,然後更換

var json = qs.stringify(fullBody); 

隨着

var json = JSON.parse(fullBody);