Axios 和 fetch 响应来自同一外部端点的不同状态代码

Posted

技术标签:

【中文标题】Axios 和 fetch 响应来自同一外部端点的不同状态代码【英文标题】:Axios and fetch responded with different status code from same external endpoint 【发布时间】:2021-01-20 07:13:09 【问题描述】:

我正在尝试向此端点发送请求:https://9gag.com/v1/group-posts/group/default/type/trending 以获取 9gag 帖子数据。

在邮递员和 chrome 上运行良好,但是当我尝试使用 Node.js 中的 axios 时,它以 403 响应(并读取返回的 DOM,它认为它要求我输入验证码),当我尝试使用node-fetch 发送请求,它以200 回复并带有帖子数据(这是正确的)。

问题是,为什么node-fetch 可以正常工作,而axios 却不行?

这是我用于测试的代码:

import axios from "axios";
import fetch from "node-fetch";

const URL = "https://9gag.com/v1/group-posts/group/default/type/trending";

// Inside async function
await fetch(URL); // Responded with 200 and json data
await axios(URL); // Responded with 403 and html DOM, axios.get() also gives the same result

【问题讨论】:

也许他们发送不同的user-agent 标头,这是决定提供验证码的一个因素? 我尝试发送具有相同 user-agent 值的标头,但 axios 仍然无法正常工作。不知何故,axios 在repl.it I made 中也能正常工作 查看实际发送的 http 请求以找出差异。 【参考方案1】:

如果您查看https://9gag.com/robots.txt,您可能会注意到Mediapartners-Google。这是一个用户代理,您必须在标头中指定才能绕过 Cloudflare 验证码。

【讨论】:

以上是关于Axios 和 fetch 响应来自同一外部端点的不同状态代码的主要内容,如果未能解决你的问题,请参考以下文章

来自守护进程的错误响应:驱动程序未能在端点modem_aryabhata 上编程外部连接

Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户

尽管响应为 200,但 Axios 状态为 449

React-native fetch Api 获取响应不同于调试模式和普通模式

08-fetch和axios

08-fetch和axios