Неожиданный результат от почтового запроса у кукловода - PullRequest
0 голосов
/ 12 января 2019

Я знаю, что это уже было рассмотрено в другом вопросе: здесь . но по какой-то причине я делаю что-то не так.

У меня проблемы с отправкой запроса с сервера, мне нужны данные. здесь

Если я напишу следующий пост-запрос прямо из консоли сайта (используя ctrl + shift + i), он прекрасно работает.

full = $.post('https://www.shufersal.co.il/_layouts/Shufersal_Pages/ajax.aspx',
{"AjaxCallAction":"AddProductToBasket","paramProductID":7296073231578,"paramQuantity":2,"paramRemarks":"","paramUM":""});

console.log(full.responseText); //required data

Вот снимок экрана с ответом, полученным с консоли сервера: здесь.

Но когда я пишу это с помощью следующего скрипта, я не получаю тот же результат

const puppeteer = require('puppeteer');
async function run() {
    let browser = await puppeteer.launch({ headless: false });
    let page = await browser.newPage();
    await page.setRequestInterception(true); //set the request option (triggered with goto)
    page.on('request', req => {
        //create data
        let prodID = 7296073231578; //shoko
        let qty = 2;
        let remarks='';
        let unitofmeasure = '';
        var request = {
            AjaxCallAction:"AddProductToBasket",
            paramProductID:prodID,
            paramQuantity:qty,
            paramRemarks:remarks,
            paramUM:unitofmeasure
        }

        var data = {
            'method': 'POST',
            'url': 'https://www.shufersal.co.il/_layouts/Shufersal_Pages/ajax.aspx', //just to make sure
            'postData': JSON.stringify(request)
        };
        req.continue(data);

    });

    const response = await page.goto('https://www.shufersal.co.il/_layouts/Shufersal_Pages/ajax.aspx');
    console.log(response.statusText());
    console.log(response.responseText);

    console.log('done');
}   
run();

Я получаю следующий результат в cmd:

OK
undefined
done

Также, если я попытаюсь опубликовать запрос, используя «запрос» nodejs: (используя ответ на вопрос здесь ) но, похоже, тоже не работает.

1 Ответ

0 голосов
/ 12 января 2019

вам нужно отправить тело запроса, используя x-www-form-urlencoded, например:

AjaxCallAction=AddProductToBasket&paramProductID=12345&....

изменить тело запроса или создать преобразователь объекта в urlencoded. также необходимо установить заголовок Content-Type и захватить ответ от response прослушивателя событий.

async function run() {
    let browser = await puppeteer.launch({headless: false});
    let page = await browser.newPage();
    await page.setRequestInterception(true); //set the request option (triggered with goto)
    page.on('request', req => {
        //create data
        let prodID = 7296073231578; //shoko
        let qty = 2;
        let remarks = '';
        let unitofmeasure = '';
        var request = {
            AjaxCallAction: "AddProductToBasket",
            paramProductID: prodID,
            paramQuantity: qty,
            paramRemarks: remarks,
            paramUM: unitofmeasure
        }
        // convert JSON to x-www-form-urlencoded
        let reqBody = Object.keys(request).map((k) => {
            return encodeURIComponent(k) + '=' + encodeURIComponent(request[k])
        }).join('&');
        var data = {
            'method': 'POST',
            'url': 'https://www.shufersal.co.il/_layouts/Shufersal_Pages/ajax.aspx',
             // the custom headers
            'headers': {
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'X-Requested-With': 'XMLHttpRequest'
            },
            'postData': reqBody
        };
        req.continue(data);
    });
    // capture intercepted response
    page.on('response', async response => {
        console.log("Resource Type: "  + response.request().resourceType());
        console.log("Response Text: " + await response.text());
        console.log("==============");
    });

    const response = await page.goto('https://www.shufersal.co.il/_layouts/Shufersal_Pages/ajax.aspx');
    // only capture default response
    //console.log(response.statusText());
    //console.log(response.responseText);

    //console.log('done');

}

run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...