美好的一天, 我正在尝试使用puppeteer无头铬库进行POST请求。我似乎无法使下面的代码工作。
// Get csrf token
let token = await page.evaluate(() => document.querySelector('[name="CSRFToken"]').value);
let postResponse = await page.evaluate(async(token, cookies) => {
let response = fetch("/loyalty/points", {
method : 'POST',
cookie : cookies,
postData : 'CSRFToken=' + token,
}).then(response => response.text()).catch(error => console.log(error));
return response;
});
console.log('Final response');
console.log(postResponse);
我一直收到一条错误,指出尚未设置CSRF令牌或cookie无效。
我的问题是,我是否在木偶操作员中使用正确的方法进行POST?如果是这样,有没有办法让我做一些调试,我可以看到发送的实际POST请求?
我感谢任何建议或帮助。感谢
答案 0 :(得分:1)
您没有创建请求正文:因此错误。您在请求对象上设置的postData
属性不是任何已知属性,因此也不会在请求中设置它,这意味着服务器永远不会看到您的CSRF令牌。您应该查看MDN docs on fetch()。
我认为只需将postData
替换为body
就可以了,但是如果不访问您的终端就很难知道。据我们所知,它可能需要特殊的标题。
鉴于您只发布了正常的表单数据(这是key=value
代码所暗示的),我还会开始使用浏览器提供的FormData
对象,以避免手动编写实现细节。< / p>
const formData = new FormData();
formData.append("CSRFToken", token);
const response = fetch("/loyalty/points", {
method : 'POST',
cookie : cookies,
body : formData,
headers : {
'cookie' : cookies,
/* other headers you need, possibly content-type (see below) */
},
}).then(response => response.text()).catch(error => console.log(error));
return response;
});
警告:使用FormData API始终会将content-type
数据设置为multipart/form-data
。如果您的服务器由于某种原因不支持该编码,并且您需要使用application/x-www-form-urlencoded
(see here for difference),
你不能盲目地改变Content-Type
:你还需要url encode the content。
对于调试,我只需使用普通的Chrome实例即可查看。您应该能够在那里运行代码并在DevTools中查看网络请求(在那里发布空请求会立即引起注意)。