节点JS并成功进行外部Web调用?

时间:2017-08-21 19:51:31

标签: javascript node.js web-services

您好我正在尝试开始学习NodeJS并且正在创建应用程序。目前的目标是通过节点调用网站,获取身份验证令牌,然后使用包含我的登录信息和身份验证令牌的POST有效负载再次呼叫该网站。 我使用python创建了相同的程序,我获得了200响应,在nodeJS中我获得了302.

我认为这是一个快速的解决方案,我猜这个问题的主要内容是我在NodeJS中缺乏理解,其中: 1.如果我应该将这些请求调用嵌套到彼此中,因为它们应该是同一个“会话”的一部分 2.如果是这样,我如何转到最后一个url,例如:example.com/poll并且能够存储/修改该信息(这只是一个json)因为/如果我使用一个来访问example.com/poll url浏览器,浏览器自动下载它包含的文件是JSON格式,并不只是显示它,这是我需要的。这样我就可以将这些数据保存在字符串等中而不是下载

在python中我这样做(创建一个会话,而不是进行两次调用)

url = "https://example.com/"
session = requests.session()
first_req = session.get(url)
auth_token_str = re.search(XXX, first_req.text)
login_url = 'https://example.com/sessions'
payload = { 'session[username_or_email]' : 'username', 'session[password]' : 'password', 'redirect_after_login':'/', 'authenticity_token': authenticity_token }
login_req = session.post(login_url, data=payload, headers=user_agent)
print "login_req response: ", login_req.status_code //gets me 200

然后在Node JS中:

var initLoad = {
method: 'GET',
url: 'https://example.com/',
headers: {
    'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
  }
};
request(initLoad, function(error, response, body) {
  if (error) throw new Error(error);
  var $ = cheerio.load(body, {xmlMode: false});
  var authenticityToken = $("input[name=authenticity_token]").val();
  console.log(authenticityToken);
  var options = {
    method: 'POST',
    url: 'https://example.com/sessions',
    headers: response.headers,
    form: {
      'session[username_or_email]': 'someUsername',
      'session[password]': 'somePassword',
      redirect_after_login: '/',
      authenticity_token: authenticityToken
    }
  };
  request(options, function(error, response2, body2) {
    if (error) throw new Error(error);
    console.log(response2.statusCode); //gets me 302 not 200
    var analytics_url = 'https://example.com/poll';
    var tripleload = {
      method: 'GET',
      url: analytics_url,
      headers: response2.headers
    };
    request(tripleload, function(error, response3, body3) {
      if (error) throw new Error(error);
      res.end(body3);
    });
  });
});

1 个答案:

答案 0 :(得分:0)

302表示临时移动的重定向,您将获得正确的错误页面(或在此情况下提供给您的服务器)。这个调用有一些东西你做错了,如果生成这样的话,url可能是错误的。

你的代码很乱,因为你是节点中的新手,因为你使用的是准确的请求,并且写这些东西几乎没有任何安慰。

使用像Axios这样的东西:https://github.com/mzabriskie/axios,以便更轻松地编写这样的请求。