如何在nodejs中发送包含重复键的字典的POST请求?

时间:2016-05-06 22:01:27

标签: node.js dictionary post

我正在尝试使用Restler在nodejs中执行POST请求,这是我的代码,它的工作原理完全没有问题:

var post = function (uri, params, callback) {
    var headers = {"User-Agent": user_agent,"Cookie": _sessionCookie}
    rest.post(uri, {
        data: params,
        followRedirects: false,
        headers: headers
    }).on('complete', function (data, response) {
        callback(data, response)
    })
}

我在我的浏览器上做了一个提交,看看我想传递哪些数据,如下图所示。但我的问题是我需要为matchanswers键传递两个值。
在上面的代码中,post函数中的'params'参数是一个字典 我的问题是如何在'params'字典中添加两个键(matchanswers)?
我已经阅读了其他帖子,他们会说这样做:

matchanswers:[1,2]

但这不起作用。当我发布这样的字典时它确实有效:

{ qid: '226',
ac: 2,
hash: null,
subject: null,
r1: null,
is_public: 'on',
submit: 1,
answers: '1',
matchanswers: [ 1 ],
importance: '3' }

enter image description here

2 个答案:

答案 0 :(得分:0)

不幸的是,你做不到。 Node不支持对象中的非唯一键。您可以检查rest.post是否接受字符串而不是对象,如果确实如此 - 预构造params字符串。

答案 1 :(得分:0)

restler.post()允许您将数据作为Javascript对象或字符串发送。如果它是一个Javascript对象,那么restler会将它串行化为JSON。但是,由于无法在Javascript对象中指定要发送的内容,因此无法发送对象。相反,您必须创建自己的字符串,其中包含所需的重复键。

因此,对于您的post()功能,让我们支持这种类型的结构来生成您在问题中显示的表单数据:

{ 
    qid: '226',
    ac: 2,
    hash: null,
    subject: null,
    r1: null,
    is_public: 'on',
    submit: 1,
    answers: '1',
    matchanswers: [ 2, 3 ],
    importance: '3' 
}

如果此结构中的数据是数组,那么我们将创建双键,每个键具有不同的值。

我们将创建一个实用程序函数,将其编码为表单数据字符串:

function makePostString(obj) {
    var output = [];
    var keys = Object.keys(obj);
    keys.forEach(function(key) {
        var base = encodeURIComponent(key) + "=";
        var value = obj[key];
        if (Array.isArray(value)) {
            value.forEach(function(item) {
                output.push(base + encodeURIComponent(item));
            });
        } else {
            if (value === null || value === undefined) {
                value = "";
            }
            output.push(base + encodeURIComponent(value));
        }
    });
    return output.join("&");
}

现在,您可以在post()函数中使用它,如下所示:

var post = function (uri, params, callback) {
    var headers = {"User-Agent": user_agent,"Cookie": _sessionCookie}
    rest.post(uri, {
        data: makePostString(params),
        followRedirects: false,
        headers: headers
    }).on('complete', function (data, response) {
        callback(data, response)
    })
}

并且,您将此类数据作为参数传递:

{ 
    qid: '226',
    ac: 2,
    hash: null,
    subject: null,
    r1: null,
    is_public: 'on',
    submit: 1,
    answers: '1',
    matchanswers: [ 2, 3 ],
    importance: '3' 
}

此处makePostString()的工作演示:https://jsfiddle.net/jfriend00/Lurvxo2e/