node-fetch发送POST请求结果与Firefox请求不一致问题排查
问题修复方案
1. 补全缺失的Content-Type请求头
你参考的是multipart/form-data类型的提交方案,和当前场景不匹配:Firefox正常请求的提交格式是application/x-www-form-urlencoded,必须在请求头中明确添加该字段,否则服务端无法正确解析表单内容。
2. 移除手动设置的Content-Length
你固定写死了Content-Length为46,如果你的邮箱、密码实际拼接后的urlencoded字符串长度和46不一致,会导致服务端接收的请求体不完整,直接判定参数错误。node-fetch会自动根据传入的body计算正确的Content-Length,无需手动指定。
3. 关闭自动重定向配置
node-fetch默认会自动跟随302重定向响应,直接返回重定向后的目标页面的200响应,你看到的200状态码大概率是这个原因导致的。只需要在请求配置中添加redirect: 'manual',即可拿到原始的302响应头,同时获取到auth_token和更新后的sessionToken。
4. 校验sessionToken的正确性
检查第一步获取到的sessionToken是否完整、大小写是否和服务端要求一致,注意cookie字段名_sessiontoken是全小写,避免拼写错误导致服务端无法识别会话。
额外说明
- X-Firefox-Spdy是Firefox浏览器自带的响应头标记,和服务端逻辑无关,缺失不影响请求结果
- HTTP/2协议不是问题原因,node环境下的HTTP/1.1请求服务端会正常兼容
修正后的请求配置参考:
const params = new URLSearchParams(); params.append('email', '你的邮箱'); params.append('password', '你的密码'); const response = await fetch('https://www.website.com/login/action', { method: 'POST', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Content-Type': 'application/x-www-form-urlencoded', 'Origin': 'https://www.website.com', 'Referer': 'https://www.website.com/login', 'Cookie': '_sessiontoken=你第一步获取的sessionToken', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1' }, body: params, redirect: 'manual' });
内容的提问来源于stack exchange,提问作者garson
相关产品推荐
相关产品推荐

