在真实设备模式下仿真或运行时,http请求未处理,但在仿真器上工作正常

时间:2018-11-16 17:46:19

标签: dart flutter localhost httprequest

在我的flutter应用程序中,我有一个用户注册表格,该表格使用http请求将数据发送到服务器。

每当我提交表单并使用仿真器(API 27和android版本8.1)发送请求时,该方法都可以正常工作,但在真实的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请求服务器。

希望您能理解我的问题。

2 个答案:

答案 0 :(得分:1)

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

让我震惊的是,如果您在“ localhost”或“ 127.0.0.1”上运行服务器,则它实际上可能并没有按照您的想法去做。它们都应托管在本地重定向中,该重定向仅允许从您自己的计算机进行访问。模拟器可能已设置好某些东西,因此其行为就像连接到本地主机一样。

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

我建议在您的服务器上放置一个虚拟终结点(例如/ healthz),该终结点只返回一个html或纯文本页面,上面写着“有效”或类似的内容。然后打开手机的网络浏览器并转到那里。如果能够正常工作,则说明您的手机能够与计算机通信,那么我们可以开始研究编码问题。如果它不起作用,则说明这与服务器的配置有关。

答案 1 :(得分:0)

我的防火墙有问题。哪个阻塞了我的9090端口。

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