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中添加:
(注:若仅访问HTTPS地址,可配置更严格的规则,上述配置用于快速验证权限问题)<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
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
相关产品推荐
相关产品推荐

