在真实设备模式下模拟或运行时未处理 http 请求,但在模拟器上运行良好

Posted

技术标签:

【中文标题】在真实设备模式下模拟或运行时未处理 http 请求,但在模拟器上运行良好【英文标题】:http request not processing while emulating or running on real device mode but works fine with emulator 【发布时间】:2019-04-19 22:36:37 【问题描述】:

在我的颤振应用程序中,我有用户注册表单,它使用 http 请求将数据发送到服务器。

每当我提交表单并使用 emulator(API 27 和 android 版本 8.1)发送请求时,它都可以正常工作,但在 real android 设备 中会出现错误本地主机服务器

SocketException: OS Error: Connection refused, errno = 111, address = 127.0.0.1, port = 48134

我正在使用版本为 7.1 的 Android 设备

代码:

final JsonDecoder _decoder = new JsonDecoder();

  Future<dynamic> post() 
    return http.post(
      "http://192.168.31.16:9091/myprj/api/register",
      body: json.encode(
        "username": "rahul",
        "password": "rahul",
        "email": "myemail@gmail.com",
      ),
      headers: "Accept": "application/json","Content-type": "application/json",,
    ).then((http.Response response) 
      final String res = response.body;
      final int statusCode = response.statusCode;

      if (statusCode < 200 || statusCode > 400 || json == null) 
        throw new Exception("Error while fetching data");
      
      return _decoder.convert(res);
    );
  

在哪里,我使用了本地网络 IP 192.168.31.16 而不是 localhost。 当我使用实时服务器地址时,它也可以使用 android 设备正常工作。问题仅在于具有真正的 android 设备的 localhost http 请求服务器。

希望你能理解我的问题。

【问题讨论】:

您需要在Android中添加互联网权限。默认情况下,它仅在调试版本中。 对不起,这似乎只是计划中的,但尚未实施github.com/flutter/flutter/issues/20789 那么你在设备上运行的时候需要连接本地主机吗? @SamiKanafani 无法使用 android 设备调用在 localhost 上运行的 REST API 【参考方案1】:

这很可能与您运行服务器的方式有关,因为只要您输入了正确的 IP 地址并且您的设备连接到同一网络,这似乎是正确的。

有一次让我大吃一惊的是,如果您在“localhost”或“127.0.0.1”上运行您的服务器,它实际上可能并没有按照您的想法运行。它们都应该托管在仅允许从您自己的计算机访问的本地重定向中。模拟器很可能已经设置了一些东西,所以它就像连接到本地主机一样。

如果您在 192.168.31.16 上运行服务器,那可能会更成功,但您可能无法从模拟器访问它。因此,请尝试在 0.0.0.0:9091 上运行,因为这意味着“本地计算机上的所有 IP 地址”,如果您还没有的话。

我建议在您的服务器上放置一个虚拟端点(如 /healthz),它只返回一个 html 或纯文本页面,上面写着“它可以工作”或类似的东西。然后打开手机的网络浏览器并前往那里。如果它有效,您就知道您的手机能够与计算机通信,然后我们就可以开始调查编码问题。如果它不起作用,你知道它与服务器的配置有关。

【讨论】:

老兄感谢您的回答,但以上都没有。我已经提到我正在使用 IP 运行服务器,并且代码没有问题。它适用于实时服务器 ip 和域。但在本地情况下,它只能与模拟器一起使用 您是否尝试在移动设备上浏览到服务器?这样我们就可以完全消除它与网络/服务器设置有关的可能性。 这也可能是防火墙或防病毒问题。暂时禁用它们可能值得尝试,看看它是否有效,然后如果需要,您可以向它们添加例外。 可能是 ip4/ip6 问题。如果您使用的是 localhost,请尝试下面的代码,看看您会得到什么。导入“飞镖:io”; main() InternetAddress.lookup("localhost").then((a) => a.forEach(print));【参考方案2】:

我的防火墙的问题。这阻塞了我的端口 9090。

所以为端口添加了防火墙规则,现在它可以正常工作了。顺便说一句,感谢@rmtmckenzie

【讨论】:

flutter项目阻塞端口这个错误如何处理。为 api 使用本地 ip。 非常感谢。我的 spring 应用程序正在监听 0.0.0.0。我的模拟器连接成功,三星S8没有。为 TCP 端口添加防火墙规则解决了这个问题。

以上是关于在真实设备模式下模拟或运行时未处理 http 请求,但在模拟器上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在连接的设备上运行或构建到 apk 时未加载 Json 文件

socket.io swift 在真实设备上不起作用

Flutter 应用程序无法在真实设备或模拟器上运行

Baqend 无法与模拟器或使用离子的真实设备一起使用

音频引擎仅在运行 iOS 10 的设备(iphone 6)上失败,在所有模拟器设备上运行良好或真实设备直到 iphone 6s

在真实 iOS 设备上模拟位置