使用nodejs请求发送表单失败

时间:2018-03-14 09:59:19

标签: node.js request cheerio

我需要在页面上发送表单以更改几个字段。我使用节点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 发送,扩展标题包含可在浏览器中看到但没有结果的其他字段

使用相同的方法登录成功,但更新表单不是。这次发送有什么问题?

不幸的是我没有访问服务器端来调试它。

1 个答案:

答案 0 :(得分:0)

答案很简单,但对我来说意外。事实证明,表单不是通过提交操作发送的,而是使用ajax请求发送的。如此成功的POST在标题中:

'X-Requested-With': 'XMLHttpRequest'

服务器可能只在它作为ajax发送时处理此表单,实际上整个页面都被重新加载。