使用PHP cURL将Post请求发送到Node.js

时间:2012-09-06 23:53:42

标签: php node.js curl

我正在尝试通过PHP cURL将post请求发送到我的node.js服务器,然后向客户端发送消息。服务器的工作和设置如下:

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未定义。为什么不明确?

3 个答案:

答案 0 :(得分:1)

您错误地使用了querystring.stringify()。请参阅此处有关querystring方法的文档:

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

我相信你想要的是像JSON.stringify()或querystring.parse(),而不是querystring.stringify(),它应该将现有对象序列化为查询字符串;这与你要做的事情正好相反。

您想要的是将fullBody字符串转换为JSON对象的内容。

答案 1 :(得分:1)

如果您的身体只包含JSON blob的字符串化版本,请替换

var json = qs.stringify(fullBody);

var json = JSON.parse(fullBody);

答案 2 :(得分:0)

尝试此代码

package com.example.demo3;

        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class Demo3Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
    }

}