Reputation: 473
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
Reputation: 19154
you need to send the request body using x-www-form-urlencoded
for example:
AjaxCallAction=AddProductToBasket¶mProductID=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