大家好,我正在尝试使用puppeteer chrome库做一个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无效的错误。
我的问题是,我是否使用了puppeteer中的正确方法来发布帖子?如果是这样的话,有没有办法让我做一些调试,让我可以看到实际发送的POST请求?
我很感谢任何建议或帮助。谢谢
发布于 2018-06-04 22:14:40
您没有创建请求正文:因此出现错误。您在request对象上设置的postData
属性不是任何已知属性,因此它也不会在请求上设置,这意味着服务器永远不会看到您的CSRF令牌。你应该调查一下MDN docs on fetch()。
我相信只要用body
替换postData
就可以了,但是如果不访问端点就很难知道。据我们所知,它可能需要特殊的头部。
由于您只发布普通表单数据(从您的key=value
代码中可以看出),我还将开始使用您的浏览器提供的FormData
对象,以避免手动编写实现细节。
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中看到网络请求(如果您发布了一个空请求,就会立即注意到这一点)。
https://stackoverflow.com/questions/50682348
复制相似问题