2017-02-24 133 views
1

我试图从一个本地nodejs(express)实例发送以下Javascript对象到另一个。JSON字符串在发布后请求

var v = { 
    items: [{ 
     id: "fil1", 
     values: [ 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" } 
     ] 
    }] 
}; 

我使用下面的发布请求,其中request = require('request'),并params是上述目的v的JSON.stringified版本。

var performPostRequest = function (ip, port, endpoint, params, callback) { 
var url = "http://" + ip + ":" + port + "/" + endpoint; 
request.post({ 
    url: url, 
    form: params, 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    } 
}, function (err, response, body) { 
    if (err) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(err, JSON.parse(body)); 
    } 
}); 
}; 

接收端点看起来是这样的:

router.post('/values', function (req, res) { 

    console.log(req.body); 

    res.status(201).send(""); 
}); 

如果路由器是express.Router()。

所以,我的问题:当打印JSON.stringify(v)在发送方,其结果是相匹配的物体V的字符串,但在接收端点打印请求的主体时,该字符串被弄乱了(见下文) 。我究竟做错了什么?

发件人

JSON.stringify(v)

{"items":[{"id":"fil1","values":[{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}]}]} 

req.body在接收器:

{ '{"items":': { '{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}': '' } } 
+0

'params'是一个字符串? [请求文档](https://www.npmjs.com/package/request#requestoptions-callback)表明'form'选项的值应该是对象或查询字符串,而不是JSON字符串。你的意思是使用'body'吗? –

回答

1

可以使用request使用json选项,完成所有的操作,发送JSON从request doc

json - 将body设置为值的JSON表示并添加 Content-type:application/json标头。此外,还将 响应正文解析为JSON。

var request = require('request'); 

var options = { 
    url: url, 
    method: 'POST', 
    json: { 
     items: [{ 
      id: "fil1", 
      values: [ 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" } 
      ] 
     }] 
    }; 
}; 

request(options, function(error, response, body) { 
    if (error) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(error, body); 
    } 
}); 
+0

谢谢伯特兰,我会试试。 json可以不使用“表单”选项吗? – GINGERT

+0

从相同的[自述文件](https://github.com/request/request):'形式 - 当传递一个对象或查询字符串时,它将身体设置为查询字符串表示形式的值,并添加Content-type:application/x-www-form-urlencoded头。当传递任何选项时,返回一个FormData实例(并通过管道请求)'。所以不,它不应该用于Json数据,而是用于URL编码数据 –