Deno中Fetch POST请求异常:与Node/Curl行为不符求助
问题分析与解决方案
你的问题核心是Deno的Fetch实现与Node.js/curl在请求头或表单处理上存在细微差异,导致目标服务器拒绝了登录请求(返回的302重定向到原URL、Cookie不全就是服务器验证失败的表现)。以下是具体排查和修复步骤:
1. 最可能的原因:User-Agent 差异
很多网站会验证请求的User-Agent头,Deno的默认UA(比如Deno/1.xx.0这类)会被识别为非标准客户端,触发服务器的拦截逻辑。而Node.js的Fetch默认UA更接近标准客户端,curl也有自己的UA,所以能正常通过验证。
修复方案:显式设置标准User-Agent及必要请求头
修改你的Fetch配置,添加浏览器风格的请求头:
// some code to get the `from` parameter // ... const fd = new URLSearchParams() Object.entries({ username: "myuser@my.email", password: "mypassword", submit: "Login", from: "L21lbnUv", remote: "", action: "auth" }).forEach(([k, v]) => { fd.set(k, v) }) const r = await fetch(`https://freedns.afraid.org/zc.php?step=2`, { redirect: "manual", method: "POST", body: fd, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } });
2. 额外排查步骤
如果上述修改后仍有问题,建议对比Node.js和Deno的请求细节:
- 打印请求头:在两边代码中添加
console.log([...r.request.headers]),查看Content-Type、Accept等头是否一致 - 验证表单编码:打印
fd.toString(),确认Node和Deno生成的表单字符串完全相同(比如空值remote=""的处理是否一致) - 检查权限:确保Deno运行时添加了网络权限:
deno run --allow-net=freedns.afraid.org your-script.js
3. 补充说明
Deno的Fetch实现严格遵循Web标准,但部分网站的服务器逻辑会针对不同客户端做特殊处理,显式模拟浏览器请求头是解决这类兼容性问题的通用方案。
内容的提问来源于stack exchange,提问作者ExtraVeral
相关产品推荐
相关产品推荐

