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

Flutter中http包GET请求失败但Postman可正常运行的原因排查

Flutter HTTP GET请求失败但Postman正常的排查方案

针对你遇到的调试器在进入try语句前就停止的情况,以下是几个常见原因及解决方法:

1. 网络权限未配置

Flutter应用默认没有网络访问权限,需要手动配置:

  • Android:在android/app/src/main/AndroidManifest.xml中,<application>标签上方添加:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • iOS:在ios/Runner/Info.plist中添加:
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
    (注:若仅访问HTTPS地址,可配置更严格的规则,上述配置用于快速验证权限问题)

2. 不必要的请求头触发服务器拒绝

你给GET请求添加了Content-Type: application/json; charset=UTF-8头,但GET请求通常无需该头(无请求体),Google Places API可能会因此拒绝请求。建议移除该头,修改后的请求代码:

var response = await client.get(Uri.parse(url_coord));

3. URL参数未正确编码

如果placeId包含特殊字符(如/、=),直接字符串拼接会导致URL无效。改用Uri.https构造函数自动编码参数:

var url_coord = Uri.https(
  'maps.googleapis.com',
  '/maps/api/place/details/json',
  {
    'fields': 'geometry',
    'place_id': placeId,
    'key': 'APIKEY'
  }
);

4. 异常捕获范围不足

当前代码仅捕获了解析JSON的异常,但await client.get()可能抛出网络异常(如超时、连接失败),导致程序在进入try前崩溃。需将请求逻辑也包裹到try块中:

getCoordinatesFromPlaceId(String placeId) async {
  var client = http.Client();
  try {
    var url_coord = Uri.https(
      'maps.googleapis.com',
      '/maps/api/place/details/json',
      {
        'fields': 'geometry',
        'place_id': placeId,
        'key': 'APIKEY'
      }
    );
    var response = await client.get(url_coord);
    var jsonResponse = json.decode(response.body);
    // 处理响应数据
  } catch (e) {
    print('请求或解析异常:$e');
  } finally {
    client.close(); // 确保关闭客户端,避免资源泄漏
  }
}

5. 网络环境差异

检查Flutter应用的网络环境:

  • 是否配置了代理,而Postman未使用相同代理?
  • 设备是否处于VPN或特殊网络环境,导致无法访问Google服务?

内容的提问来源于stack exchange,提问作者Lash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:18:42