我正在尝试使用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' }
答案 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/