Flutter HTTP请求仅首次响应问题求助(Tenda路由器+Sonoff设备)
问题分析
你的问题核心是Flutter代码首次请求Sonoff设备正常,后续无响应,但Postman请求完全正常。最可能的原因是请求格式不匹配:当前Flutter代码使用默认的表单编码发送请求,但Postman大概率是发送JSON格式的请求,设备仅接受JSON格式,首次请求可能因设备兼容偶然成功,后续则被拒绝。
解决方案
1. 修正POST请求格式,与Postman保持一致
将请求体转换为JSON字符串,并设置正确的Content-Type请求头,确保和Postman的请求格式完全匹配:
void sendRequest() async { print('first'); var client = http.Client(); try { print('before send'); // 构造JSON格式的请求体 var requestBody = jsonEncode({ "deviceid": "10016b7046", "data": { "subDevId": "3d18474c3831311947313130", "outlet": 3, "time": 180 } }); var response = await client.post( Uri.http('192.168.1.2:8081', 'zeroconf/monitor'), headers: {'Content-Type': 'application/json'}, // 匹配Postman的请求头 body: requestBody, ); // 新增日志,排查后续请求的状态和响应 print('Response status: ${response.statusCode}'); print('Response body: ${utf8.decode(response.bodyBytes)}'); var decoderes = jsonDecode(utf8.decode(response.bodyBytes)) as Map; print('after send1'); var url = Uri.parse(decoderes['url'] as String); print('after send33'); print(await client.get(url)); } finally { print('after send'); client.close(); } print('after send2'); }
2. 其他排查方向
- 测试无客户端复用的请求:尝试直接使用
http.post而非自定义http.Client,排查是否是连接复用导致的设备拦截:var response = await http.post( Uri.http('192.168.1.2:8081', 'zeroconf/monitor'), headers: {'Content-Type': 'application/json'}, body: requestBody, ); - 检查路由器/设备限制:查看Tenda路由器是否开启IP限流、防火墙功能,是否拦截同一IP的重复请求;Sonoff设备是否存在单IP连接数限制。
验证方法
修改代码后多次点击按钮测试,若请求恢复正常,说明是请求格式问题;若仍无响应,根据打印的状态码(如400、500)和响应内容,结合路由器、设备的日志进一步定位问题。
内容的提问来源于stack exchange,提问作者Reem
相关产品推荐
相关产品推荐

