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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:41:12