You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录网站后获取Session Cookie问题及request替代方案咨询

问题解答

一、Session Cookie出现在错误信息中的原因及解决方法

你遇到的302状态码是服务器返回的重定向响应,request-promise默认会将3xx类状态码判定为错误并抛出,因此包含Session Cookie的响应头被归入了错误对象中。

方案1:修改请求选项,正确获取Cookie

通过配置请求参数,让工具正常处理重定向并返回完整响应,从而直接提取Cookie:

var rp = require('request-promise');
async function parse_sign_up() {
  const options = {
    method: 'POST',
    uri: 'https://example/login/',
    form: {
      username: 'admin',
      password: 'admin'
    },
    followAllRedirects: true, // 跟随所有重定向
    resolveWithFullResponse: true, // 返回完整响应对象(包含头信息)
    simple: false // 不将非2xx状态码视为错误
  };

  try {
    const response = await rp(options);
    // 从响应头中筛选出Session Cookie
    const sessionCookie = response.headers['set-cookie'].find(cookie => cookie.startsWith('session='));
    console.log('Session Cookie:', sessionCookie);
  } catch (err) {
    console.log(err);
  }
}

方案2:直接从错误对象中提取Cookie

如果不想修改请求基础配置,也可以在捕获错误时直接从错误对象里拿到Cookie:

rp(options)
  .then(function(body) {
    console.log(body);
  })
  .catch(function(err) {
    // 从rawHeaders数组中定位Set-Cookie字段
    const cookieIndex = err.response.rawHeaders.indexOf('Set-Cookie');
    if (cookieIndex !== -1) {
      const sessionCookie = err.response.rawHeaders[cookieIndex + 1];
      console.log('Session Cookie:', sessionCookie);
    }
  });

二、request包废弃后的替代方案

由于request及其衍生包(如request-promise)已停止维护,推荐以下几个成熟的Node.js HTTP客户端:

1. Axios

基于Promise的HTTP客户端,支持浏览器和Node.js,API简洁易上手:

const axios = require('axios');
const qs = require('qs');

async function login() {
  try {
    const response = await axios.post('https://example/login/', qs.stringify({
      username: 'admin',
      password: 'admin'
    }), {
      maxRedirects: 0, // 禁用自动重定向,直接获取含Cookie的响应
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    });
    const sessionCookie = response.headers['set-cookie'].find(cookie => cookie.startsWith('session='));
    console.log('Session Cookie:', sessionCookie);
  } catch (err) {
    // 服务器返回302时,Axios会抛出错误,可从err.response中提取Cookie
    if (err.response?.headers['set-cookie']) {
      const sessionCookie = err.response.headers['set-cookie'].find(cookie => cookie.startsWith('session='));
      console.log('Session Cookie:', sessionCookie);
    }
  }
}

2. node-fetch

Node.js官方推荐的Fetch API实现,语法与浏览器端Fetch保持一致:

const fetch = require('node-fetch');
const qs = require('qs');

async function login() {
  try {
    const response = await fetch('https://example/login/', {
      method: 'POST',
      body: qs.stringify({ username: 'admin', password: 'admin' }),
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      redirect: 'manual' // 手动处理重定向,避免自动跳转丢失Cookie信息
    });
    const sessionCookie = response.headers.get('set-cookie');
    console.log('Session Cookie:', sessionCookie);
  } catch (err) {
    console.log(err);
  }
}

3. Got

专为Node.js设计的HTTP客户端,功能丰富,支持Promise和流操作:

const got = require('got');

async function login() {
  try {
    const response = await got.post('https://example/login/', {
      form: { username: 'admin', password: 'admin' },
      followRedirect: false, // 禁用自动重定向
      responseType: 'text'
    });
    const sessionCookie = response.headers['set-cookie'].find(cookie => cookie.startsWith('session='));
    console.log('Session Cookie:', sessionCookie);
  } catch (err) {
    if (err.response?.headers['set-cookie']) {
      const sessionCookie = err.response.headers['set-cookie'].find(cookie => cookie.startsWith('session='));
      console.log('Session Cookie:', sessionCookie);
    }
  }
}

内容的提问来源于stack exchange,提问作者Angels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:33:20