使用 nodejs 请求发送表单失败
Sending form with nodejs request fails
我需要在页面上发送表单以更改几个字段。我使用节点 js 和 request,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);
Session 完美创建,我可以访问受保护的页面。表单字段也改变得很好。但是 Answer 不包含更新的数据。加载结果与之前相同(操作 URL 实际上是相同的,所以答案看起来像我之前发送的常规 GET 请求)。
我尝试将表单发送为 form、body、formData , 扩展 headers 添加了可以在浏览器中看到但没有结果的字段。
同样的方法登录成功,但更新表单失败。这个发送有什么问题?
不幸的是,我无法访问服务器端进行调试。
答案很简单,但出乎我的意料。事实证明,表单不是通过提交操作发送的,而是通过 ajax 请求发送的。如此成功 POST 在 header:
'X-Requested-With': 'XMLHttpRequest'
服务器可能仅在作为 ajax 发送时才处理此表单,实际上整个页面都会重新加载。
我需要在页面上发送表单以更改几个字段。我使用节点 js 和 request,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);
Session 完美创建,我可以访问受保护的页面。表单字段也改变得很好。但是 Answer 不包含更新的数据。加载结果与之前相同(操作 URL 实际上是相同的,所以答案看起来像我之前发送的常规 GET 请求)。
我尝试将表单发送为 form、body、formData , 扩展 headers 添加了可以在浏览器中看到但没有结果的字段。
同样的方法登录成功,但更新表单失败。这个发送有什么问题?
不幸的是,我无法访问服务器端进行调试。
答案很简单,但出乎我的意料。事实证明,表单不是通过提交操作发送的,而是通过 ajax 请求发送的。如此成功 POST 在 header:
'X-Requested-With': 'XMLHttpRequest'
服务器可能仅在作为 ajax 发送时才处理此表单,实际上整个页面都会重新加载。