Dart调用NewsAPI报Invalid internet address错误但接口可用怎么办
问题原因
- 移动端未配置网络权限:Android/iOS应用默认禁止网络访问,未声明权限时会触发域名解析失败
- 运行环境DNS异常:模拟器、真机或本地开发设备的DNS缓存损坏,或当前使用的DNS服务器无法解析
newsapi.org域名 - 代理/VPN规则不匹配:运行环境开启了代理或VPN,但Dart进程/应用未适配对应代理规则,导致域名路由失败
- URL构造隐性问题:字符串形式的URL中存在不可见特殊字符,
Uri.parse解析后域名信息异常 - 网络权限拦截:桌面端未授予Dart进程/代码编辑器网络权限,或防火墙、安全软件拦截了请求
解决方案
- 补全移动端网络权限
- Android端:在
android/app/src/main/AndroidManifest.xml的manifest标签内添加网络权限声明:
<uses-permission android:name="android.permission.INTERNET" />- iOS端:在
ios/Runner/Info.plist的dict标签内添加网络访问配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - Android端:在
- 修复DNS解析问题
- 先在运行环境的自带浏览器中打开请求URL,确认能正常返回JSON数据,排除运行环境本身的网络故障
- 切换网络(如WiFi换手机热点)后重试,或手动修改hosts文件绑定
newsapi.org的可用IP
- 排查代理/VPN干扰
- 暂时关闭运行环境的代理、VPN后重试请求
- 必须使用代理的场景,需在Dart代码中显式配置网络代理规则
- 优化URI构造逻辑
改用Uri.https构造方法手动拼接参数,避免字符串URL的隐性字符问题,修改后的请求代码如下:class News { List<ArticleModel> news = []; Future<void> getNews() async { // 改用Uri构造方法避免字符串解析问题 final uri = Uri.https('newsapi.org', '/v2/top-headlines', { 'country': 'us', 'category': 'business', 'apiKey': 'd2c9e9553c4647f3add970ed74a812ee' }); var response = await http.get(uri); var jsonData = jsonDecode(response.body); if (jsonData['status'] == "ok") { jsonData["articles"].forEach((element) { if (element['urlToImage'] != null && element['description'] != null) { ArticleModel articleModel = ArticleModel( title: element['title'], author: element['author'], description: element['description'], urlToImage: element['urlToImage'], // publshedAt: DateTime.parse(element['publishedAt']), content: element["content"], url: element["url"], ); news.add(articleModel); } }); } } } - 解除网络拦截
桌面端运行时可先暂时关闭防火墙、安全软件,或将Dart进程、代码编辑器加入网络访问白名单后重试。
内容的提问来源于stack exchange,提问作者Osama Sayed
相关产品推荐
相关产品推荐

