2012-01-05 31 views
17

Envío una solicitud web de POST desde C# junto con los datos de un objeto JSON. Y quiere recibirlo en un servidor Node.js así:Cómo recibir JSON en la solicitud POST de node.js express?

var express = require('express'); 
var app = express.createServer(); 

app.configure(function(){ 
    app.use(express.bodyParser()); 
}); 
app.post('/ReceiveJSON', function(req, res){ 
        //Suppose I sent this data: {"a":2,"b":3} 

           //Now how to extract this data from req here? 

           //console.log("req a:"+req.body.a);//outputs 'undefined' 
        //console.log("req body:"+req.body);//outputs '[object object]' 


    res.send("ok"); 
}); 

app.listen(3000); 
console.log('listening to http://localhost:3000');  

Además, el C# final de la POST WebRequest se invoca mediante el siguiente método:

public string TestPOSTWebRequest(string url,object data) 
{ 
    try 
    { 
     string reponseData = string.Empty; 

     var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 
     if (webRequest != null) 
     { 
      webRequest.Method = "POST"; 
      webRequest.ServicePoint.Expect100Continue = false; 
      webRequest.Timeout = 20000; 


      webRequest.ContentType = "application/json; charset=utf-8"; 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(data.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      ser.WriteObject(ms, data); 
      String json = Encoding.UTF8.GetString(ms.ToArray()); 
      StreamWriter writer = new StreamWriter(webRequest.GetRequestStream()); 
      writer.Write(json); 
     } 

     var resp = (HttpWebResponse)webRequest.GetResponse(); 
     Stream resStream = resp.GetResponseStream(); 
     StreamReader reader = new StreamReader(resStream); 
     reponseData = reader.ReadToEnd(); 

     return reponseData; 
    } 
    catch (Exception x) 
    { 
     throw x; 
    } 
} 

invocación de método:

TestPOSTWebRequest("http://localhost:3000/ReceiveJSON", new TestJSONType { a = 2, b = 3 }); 

¿Cómo puedo analizar los datos JSON del objeto de solicitud en el código node.js anterior?

Respuesta

22

bodyParser lo hace automáticamente para usted, acaba de hacer console.log(req.body)

Editar: Su código es incorrecto porque primero incluye app.router(), antes de la bodyParser y todo lo demás. Eso es malo. Ni siquiera debería incluir app.router(), Express lo hace automáticamente por usted. He aquí cómo usted código debería ser similar:

var express = require('express'); 
var app = express.createServer(); 

app.configure(function(){ 
    app.use(express.bodyParser()); 
}); 

app.post('/ReceiveJSON', function(req, res){ 
    console.log(req.body); 
    res.send("ok"); 
}); 

app.listen(3000); 
console.log('listening to http://localhost:3000'); 

Puede probar esto usando buen módulo de Mikeal Request, mediante el envío de una solicitud POST con esos parametros:

var request = require('request'); 
request.post({ 
    url: 'http://localhost:3000/ReceiveJSON', 
    headers: { 
    'Content-Type': 'application/json' 
    }, 
    body: JSON.stringify({ 
    a: 1, 
    b: 2, 
    c: 3 
    }) 
}, function(error, response, body){ 
    console.log(body); 
}); 

actualización: utilizar body-parser por expreso 4 +.

+0

consola .log (req.body) produce [object object]; Intenté también req.body.a pero imprime indefinido. – zee

+0

He editado mi código, su error fue colocar el enrutador antes que cualquier otro middleware (incluido bodyParser). – alessioalex

+0

hmmm. pero ahora console.log (req.body); salidas {}! cómo extraer las propiedades del objeto json a & b? – zee

27

La solicitud tiene que ser enviado con: Content-Type: "application/json; charset = UTF-8"

lo contrario, el bodyParser tira su objeto como una clave en otro objeto :)

+1

¡oh genio! ¡Cómo lo extrañé! –

+1

señor, acaba de salvar mi día – MetaLik

Cuestiones relacionadas