Flutter调用CoinAPI获取BTC汇率遇Failed host lookup错误求助
解决CoinAPI获取BTC兑USD汇率时的Failed host lookup错误
核心原因排查与解决方案
Failed host lookup本质是域名解析失败或网络请求无法正常发起,以下是针对性解决步骤:
1. 补全应用网络权限
Flutter应用默认无网络访问权限,需手动配置:
- Android:在
android/app/src/main/AndroidManifest.xml中添加权限代码:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- iOS:在
ios/Runner/Info.plist中添加ATS配置(若API为HTTPS可简化,但若域名存在证书问题需开启):
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
2. 校验CoinAPI请求地址
确保请求URL完全正确,CoinAPI v1的汇率端点格式为:
https://rest.coinapi.io/v1/exchangerate/BTC/USD?apikey=你的API_KEY
需注意:
- 必须以
https://开头(HTTP请求会被iOS ATS拦截) - 域名拼写为
rest.coinapi.io,无错别字 - 携带有效API Key(需在CoinAPI官网注册获取免费额度)
3. 排查设备网络环境
- 确认测试设备(真机/模拟器)已连接可用WiFi/蜂窝网络
- 关闭可能拦截请求的VPN、代理或防火墙
- 模拟器可尝试重置网络设置后重启
4. 修正代码中的请求逻辑
确保网络请求代码无错误,以下是标准示例:
coin_data.dart
import 'package:http/http.dart' as http; import 'dart:convert'; class CoinData { final String _apiKey = "你的API_KEY"; Future<double> fetchBTCtoUSDRate() async { final uri = Uri.parse( "https://rest.coinapi.io/v1/exchangerate/BTC/USD?apikey=$_apiKey"); final response = await http.get(uri); if (response.statusCode == 200) { final data = jsonDecode(response.body); return data["rate"]; } else { throw Exception("请求失败:${response.statusCode}"); } } }
price_screen.dart
import 'package:flutter/material.dart'; import 'coin_data.dart'; class PriceScreen extends StatefulWidget { const PriceScreen({super.key}); @override State<PriceScreen> createState() => _PriceScreenState(); } class _PriceScreenState extends State<PriceScreen> { final CoinData _coinData = CoinData(); double? _btcToUsdRate; String _errorMsg = ""; @override void initState() { super.initState(); _loadExchangeRate(); } void _loadExchangeRate() async { try { final rate = await _coinData.fetchBTCtoUSDRate(); setState(() { _btcToUsdRate = rate; }); } catch (e) { setState(() { _errorMsg = e.toString(); }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("BTC 兑 USD 汇率")), body: Center( child: _btcToUsdRate != null ? Text( "1 BTC = \$${_btcToUsdRate!.toStringAsFixed(2)}", style: const TextStyle(fontSize: 24), ) : _errorMsg.isNotEmpty ? Text("加载失败:$_errorMsg") : const CircularProgressIndicator(), ), ); } }
验证流程
- 用浏览器/Postman直接请求API地址,确认能返回有效数据
- 打印代码中的请求URL,检查是否与测试地址一致
- 重新编译应用,测试网络请求是否正常
内容的提问来源于stack exchange,提问作者Fred_Wolfe
相关产品推荐
相关产品推荐

