noam7700
noam7700

Reputation: 473

Unexpected result from post request in puppeteer

I know this already been covered in another question: here. but for some reason, I do something wrong.

I'm having trouble with post request from server I need data of. here

If I write the following post request directly from the website's console (using ctrl+shift+i) it works great.

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

Here's a screenshot of the response I get from the server console: here.

But when I write this with the following script, I dont get the same result

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();

I get the following result in the cmd:

OK
undefined
done

Also, if I try to post request using "request" of nodejs: (using answered question here) but it doesn't seem to work either.

Upvotes: 1

Views: 3288

Answers (1)

ewwink
ewwink

Reputation: 19154

you need to send the request body using x-www-form-urlencoded for example:

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

modify the req body or create object to urlencoded converter. it is also required to set header Content-Type and capture the response from response event listener.

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();

Upvotes: 1

Related Questions