如何使用Google Chrome Puppeteer库执行POST请求?

时间:2018-06-04 13:58:22

标签: javascript node.js google-chrome puppeteer

美好的一天, 我正在尝试使用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请求?

我感谢任何建议或帮助。感谢

1 个答案:

答案 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-urlencodedsee here for difference), 你不能盲目地改变Content-Type:你还需要url encode the content

对于调试,我只需使用普通的Chrome实例即可查看。您应该能够在那里运行代码并在DevTools中查看网络请求(在那里发布空请求会立即引起注意)。