Flutter中向同一URL发送4次POST请求遇超时异常求助
Flutter POST请求反复超时的排查与解决
先验证目标设备的响应能力
别直接用Flutter代码测试,先用终端的curl工具发请求,确认设备本身能不能正常响应:curl -X POST http://192.168.1.2:8081/zeroconf/monitor -H "Content-Type: application/json" -d '{"deviceid": "10016b7046", "data": {"subDevId": "3d18474c3831311947313130", "outlet": 0, "time": 1}}'如果
curl也超时,说明问题出在设备(比如服务未启动、端口未开放)或网络(路由器防火墙限制),和Flutter无关。补全请求头,确保服务器能解析JSON
你用了jsonEncode但没设置Content-Type头,服务器可能无法正确识别请求体,导致一直挂起不响应。修改代码添加请求头:await http.post( Uri.parse('http://192.168.1.2:8081/zeroconf/monitor'), headers: {'Content-Type': 'application/json'}, // 新增这行 body: jsonEncode({ "deviceid": '10016b7046', "data": { "subDevId": '3d18474c3831311947313130', "outlet": 0, "time": 1 } }) ).timeout(Duration(seconds: 5)).then((value) { print(value.body); });控制请求频率,避免设备限流
连续发送4次请求可能触发设备的限流机制,导致设备拒绝响应。在请求之间增加延迟:for (int i = 0; i < 4; i++) { await Future.delayed(Duration(milliseconds: 500)); // 每次请求间隔500毫秒 await http.post( Uri.parse('http://192.168.1.2:8081/zeroconf/monitor'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({ "deviceid": '10016b7046', "data": { "subDevId": '3d18474c3831311947313130', "outlet": 0, "time": 1 } }) ).timeout(Duration(seconds: 5)).then((value) { print(value.body); }); }检查网络环境兼容性
Tenda路由器、TVBox这类设备通常只支持2.4G WiFi频段,把Flutter设备和目标设备统一连到2.4G网络;另外关闭路由器的AP隔离功能,确保设备之间能直接通信。捕获异常细节,定位问题类型
给请求加上try-catch,打印具体异常信息,区分是连接超时还是读取超时:try { var response = await http.post( Uri.parse('http://192.168.1.2:8081/zeroconf/monitor'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({ "deviceid": '10016b7046', "data": { "subDevId": '3d18474c3831311947313130', "outlet": 0, "time": 1 } }) ).timeout(Duration(seconds: 5)); print(response.body); } on TimeoutException catch (e) { print('请求超时详情: $e'); } catch (e) { print('其他异常详情: $e'); }
内容的提问来源于stack exchange,提问作者Reem
相关产品推荐
相关产品推荐

