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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:30:07