调用CoinGecko价格图表API遇JS/Cookie启用错误,Postman与Flutter如何处理?
问题原因
CoinGecko近期对非浏览器的API请求增加了反爬检测,会验证请求是否来自真实浏览器(通过请求头、Cookie等信息),而Postman或Flutter客户端默认的请求不具备这些特征,因此被拦截。
Postman中的解决步骤
复制浏览器的请求头信息
- 打开浏览器访问目标API地址,按F12打开开发者工具
- 切换到「Network」标签,刷新页面后找到该JSON请求,查看「Request Headers」
- 复制
User-Agent和Cookie这两个字段的内容 - 在Postman的请求「Headers」中添加这两个字段,粘贴对应的值
开启Postman的自动Cookie管理
进入Postman的「Settings」→「General」,勾选「Automatically send cookies」,后续请求会自动携带获取到的Cookie
Flutter中的解决步骤
方法1:手动添加请求头(快速临时解决)
使用http包时,直接在请求中加入浏览器的User-Agent和Cookie:
import 'package:http/http.dart' as http; Future<void> getCoinChartData() async { final apiUrl = Uri.parse('https://www.coingecko.com/price_charts/486/usd/24_hours.json'); final response = await http.get( apiUrl, 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', 'Cookie': '从浏览器复制的Cookie内容', }, ); if (response.statusCode == 200) { // 处理返回的图表数据 print(response.body); } else { print('请求失败:${response.statusCode}'); } }
方法2:自动管理Cookie(长期稳定方案)
使用dio配合cookie_jar库,自动获取并维护Cookie:
- 先在
pubspec.yaml中添加依赖:
dependencies: dio: ^5.3.3 cookie_jar: ^4.0.1
- 编写请求代码:
import 'package:dio/dio.dart'; import 'package:cookie_jar/cookie_jar.dart'; Future<void> fetchChartData() async { final dio = Dio(); final cookieJar = CookieJar(); // 添加Cookie管理拦截器 dio.interceptors.add(CookieManager(cookieJar)); // 先请求CoinGecko主页获取有效Cookie await dio.get('https://www.coingecko.com/'); // 再请求图表API final response = await dio.get( 'https://www.coingecko.com/price_charts/486/usd/24_hours.json', options: Options( 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', }, ), ); print(response.data); }
重要提示
你当前使用的是CoinGecko的非官方前端API,这类API没有公开的使用协议,随时可能被调整或封禁。建议改用CoinGecko官方提供的API(如/coins/{id}/market_chart接口)来获取价格数据,再自行绘制图表,官方API更稳定且有明确的使用规则。
内容的提问来源于stack exchange,提问作者mohammed ibrahim
相关产品推荐
相关产品推荐

