首页 > 解决方案 > 在真实设备模式下模拟或运行时未处理 http 请求,但在模拟器上运行良好

问题描述

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

每当我使用模拟器(API 27 和 android 版本 8.1)提交表单并发送请求时,它工作正常,但在真正的 android 设备中它会在localhost服务器上出现错误

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);
    });
  }

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

希望你能理解我的问题。

标签: dartflutterlocalhosthttprequest

解决方案


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

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

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

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


推荐阅读