在REST API中通过POST方法发送键/值数据

时间:2016-10-21 15:01:21

标签: javascript node.js rest

我正在开发一个REST API,其中包含一个POST方法来创建新的小部件。 我需要发送的数据如下所示:

 key                           |          value
 widgetnum                     |          12345
 02:00:00_03:00:00_mtwrfsn     |          johndoe@myemail.com
 12:00:00_15:00:00_mt          |          janedoe@yahoo.com

到目前为止,我一直通过BODY中的两个键发布数据:

widgetnum : 12345
tc : 02:00:00_03:00:00_mtwrfsn_johndoe@myemail.com,12:00:00_15:00:00_mt_janedoe@yahoo.com

正如您在上面的示例中所看到的,键“tc”实际上包含两个记录的信息,只是用逗号分隔。 但昨天我在Postman应用程序中探索......我意识到我可以发送多个键/值对。我不知道为什么以前从未点击过。 (这样的菜鸟)无论如何,我现在意识到,我实际上可以做到这一点:

widgetnum : 12345
02:00:00_03:00:00_mtwrfsn : johndoe@myemail.com
12:00:00_15:00:00_mt  : janedoe@yahoo.com

问题

就我的javascript代码而言,更改POST数据的方式是否更有效?例如,今天,我的代码如下所示:

router.post('/', function(req, res, next) {
        var widgetnum = req.body.widgetnum;
        var tc = req.body.tc;
        var tc_array = tc.split(",");

aka - 我能够使用非常具体的密钥名称查找我的数据。

但是,如果我更改发布数据的方式,我相信我必须循环才能找到所有密钥 所以像这样:

router.post('/', function(req, res, next) {
        //loop through req.body object.
        for (var key in req.body) {
                if (req.body.hasOwnProperty(key)) {
                        // add some logic here to test if the key is
                        // widgetnum or a tc type key.
                        console.log(key + " -> " + req.body[key]);
                }
        }
        res.status(200).send('ok');
        return;
});

如果这似乎是一个补救问题,我很抱歉 - 可能是。 但是如果在一个键/值对中POST多个tc记录是不好的形式,我很乐意改变它。也许有一种更有效的方法来编写我的javascript代码来查找数据。

感谢。

1 个答案:

答案 0 :(得分:0)

要发送和接收键/值对,格式已经存在(几乎)为您完成工作。其中之一是JSON,它得到了广泛的支持,特别是在JavaScript中。

由于您已经使用express,您可以添加body-parser并将其设置为自动解析JSON:

发送数据(POSTMan:正文类型:application / json,复制粘贴在正文中。

{
    "widgetnum" : 12345,
    "tc" : {
        "02:00:00_03:00:00_mtwrfsn": johndoe@myemail.com,
        "12:00:00_15:00:00_mt": janedoe@yahoo.com
    } 
}

服务器代码:

"use strict";

const express = require('express'),
    router = express.Router(),
    bodyParser = require('body-parser');

router.use(bodyParser.json());

router.post('/', function(req, res, next) {
    var widgetnum = req.body.widgetnum;
    var tc = req.body.tc;
    //No more need for tc_array
    //...
}

不再需要您的自定义格式,并且req.body将是与发送的JSON相同形式的JS对象,因此您可以执行以下操作:

console.log(req.body.tc['02:00:00_03:00:00_mtwrfsn']); //print johndoe@myemail.com
console.log(Object.keys(req.body.tc)); //Print ['02:00:00_03:00:00_mtwrfsn', '12:00:00_15:00:00_mt']