我需要在页面上发送表单以更改几个字段。我使用节点js和请求, cheerio :
const request = require('request');
const cheerio = require('cheerio');
const LOGIN_PAGE = 'http://some.url/login';
const LOGIN = 'login';
const PASSWORD = 'password';
const PAGE = 'http://some.url/admin/page/update/1';
const VAR_1 = 2;
const VAR_2 = 1;
let jar = request.jar();
function createSession(callback) {
let params = {
url: LOGIN_PAGE,
jar: jar,
};
request(params, function(err, res, body) {
let $ = cheerio.load(body);
$('form input[name="login"]').val(LOGIN);
$('form input[name="password"]').val(PASSWORD);
let params = {
url: LOGIN_PAGE,
method: 'POST',
form: $('form').serialize(),
jar: jar,
};
request(params, function() {
return callback();
});
});
}
function sendForm() {
let params = {
url: PAGE,
jar: jar,
};
request(params, function(err, res, body) {
let $ = cheerio.load(body);
$('form select[name="Data[var_1]"]').val(VAR_1);
$('form input[name="Data[var_2]"]').val(VAR_2);
let params = {
url: $('form').attr('action'),
method: 'POST',
form: $('form').serialize(),
jar: jar,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-CSRF-TOKEN': $('form input[name="_token"]').val(),
}
};
request(params, function(err, res, body) {
let $ = cheerio.load(body);
console.log($('form').serializeArray());
});
});
}
createSession(sendForm);
会话创建完美,我可以访问受保护的页面。表单字段也改变了。但答案不包含更新的数据。加载的结果与之前相同(操作URL实际上是相同的,所以答案看起来像我之前发送的通常的GET请求)。
我尝试将表单作为表单,正文, formData 发送,扩展标题包含可在浏览器中看到但没有结果的其他字段
使用相同的方法登录成功,但更新表单不是。这次发送有什么问题?
不幸的是我没有访问服务器端来调试它。
答案 0 :(得分:0)
答案很简单,但对我来说意外。事实证明,表单不是通过提交操作发送的,而是使用ajax请求发送的。如此成功的POST在标题中:
'X-Requested-With': 'XMLHttpRequest'
服务器可能只在它作为ajax发送时处理此表单,实际上整个页面都被重新加载。