如何使用Flutter中的Dart http包指向localhost:8000?

时间:2017-11-19 00:32:51

标签: http dart localhost flutter

我正在跟随Flutter Networking/HTTP tutorial向我的localhost:8000上运行的服务器发出GET请求。通过我的浏览器访问我的localhost工作正常。我的代码如下所示:

var url = 'http://localhost:8000';
Future<String> getUnits(String category) async {
    var response = await httpClient.get('$url/$category');
    return response.body;
}

当我指向任何真实的网址(例如https://example.com)时,此功能正常,但当我指向https://localhost:8000https://localhost(或其中的任何变体)时,我收到错误从:

开始
E/flutter ( 4879): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 4879): SocketException: OS Error: Connection refused, errno = 111, address = localhost, port = 47060
E/flutter ( 4879): #0      IOClient.send (package:http/src/io_client.dart:30:23)

每次重新加载应用时,上述错误中的端口都会更改。我查看了http package code,似乎没有办法为URL指定端口。我如何指向我的本地主机?

12 个答案:

答案 0 :(得分:10)

localhost替换字符串10.0.2.2为我解决了这个问题,因为我在Android模拟器中运行代码,该模拟器在VM中运行。它基本上是this question的副本。

答案 1 :(得分:6)

我遇到了同样的问题,很明显,我找到了解决此问题的方法,因此,因为您使用手机处于虚拟环境中,所以无法使用本地主机,因为手机未与您的 PC 如此简单地连接,在我的案例,它有效,只需使用:

10.0.2.2:PORT 

将此 URL 与您的端口一起使用,它应该可以工作:)

答案 2 :(得分:4)

如果您使用的是Android模拟器,则模拟器上的localhost不是127.0.0.0,而是10.0.2.2,因此,在Android模拟器上,您需要编写https://10.0.2.2:8000https://127.0.0.1:8000在真实设备上也无法使用。因为localhost在实际设备上的含义有所不同。

有关如何在模拟器或真实设备上将Flutter应用程序连接到localhost的更多信息,请单击链接Connecting Flutter application to Localhost

答案 3 :(得分:3)

要查找IP的是ifconfig mac / linux

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500


    this one => inet 192.168.43.57 netmask 0xffffff00 broadcast 192.168.43.255

    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active

启动php

php -S 192.168.43.57:5000 index.php

比对未来的声明

Future<String> getIsi()async{
      final res = await new Dio().get('http://192.168.43.57:5000/lihat-isi');
      print('res.data');
      return res.data;
    }

结果是

I/flutter ( 3250): [{"id":"1","judul":"asasa","gambar":"asa","ket":"asa"},{"id":"2","judul":"asasa","gambar":"asa","ket":"asa"},{"id":"3","judul":"asasa","gambar":"asa","ket":"asa"},{"id":"4","judul":"asasa","gambar":"asa","ket":"asa"}]

答案 4 :(得分:2)

简答:你可以传递一个Uri而不是一个字符串作为参数

      var client = createHttpClient();
      client.get(new Uri.http("locahost:8000", "/category"));

答案 5 :(得分:2)

尝试将仿真器或设备的端口转发到计算机端口

例如,如果您的服务器在localhost:8000上运行,则运行此命令

adb reverse tcp:8000 tcp:8000

此命令实际上将电话的8000端口重定向到计算机的8000端口。现在,您的客户端应该可以与本地运行的服务器进行通话

答案 6 :(得分:2)

如果您尝试通过模拟器访问localhost api,请将localhost更改为您的IPV4地址。并且,如果您在Visual Studio中运行api,请将应用程序URL也设置为IPV4地址。 就我而言,我将其从“ localhost:5001”更改为192.168.XX.XX:5001

如果不更改后端,则从仿真器访问localhost时将返回“错误的请求-无效的主机名”

enter image description here

答案 7 :(得分:2)

我使用ubuntu 20LTS,laravel后端,抖动的http包。

  • 步骤1:在终端运行 DB::statement(DB::raw('set @rownum='.$limit_start)); $forumPosts = ForumPost ::getByForumThreadId($forum_thread_id) ->orderBy($order_by, $order_direction) ->offset($limit_start) ->take($forum_posts_per_page) ->select('forumPosts.*',DB::raw('@rownum := @rownum + 1 AS rownum')) ->get(); 中。该软件包支持sudo apt-get install net-tools命令运行。
  • 第2步:在终端运行ifconfig中。然后在输出中搜索此行ifconfig。然后复制inet 192.168.43.217 netmask 255.255.255.0 broadcast 192.168.43.255 IP地址。另外,请注意,ip-address对您来说会有所不同。对我来说是inet 192.168.43.217
  • 第3步:转到您的laravel项目192.168.43.217,然后运行cd your_laravel_project作为inet地址。
  • 第4步:然后从颤抖sudo php -S 192.168.43.217:81 -t public 呵呵!这对我有用。

答案 8 :(得分:1)

我假设通过计算机浏览器访问Localhost?

在Flutter代码中使用“ http://localhost:port”指向本地仿真器设备,而不是在计算机上运行的本地服务器。

将网址指向服务器计算机的IP地址,即可解决此问题。

答案 9 :(得分:1)

如果指向 10.0.:2.2:port 后仍然无法工作 很可能 Android 不允许 http 流量。

更改AndroidManifest.xml android/app/src/main

包括

 android:usesCleartextTraffic="true" 

如下图

<application
        android:name="io.flutter.app.FlutterApplication"
        android:label="app_name"
        android:icon="@mipmvvap/ic_vvlauncher"
        android:usesCleartextTraffic="true">

答案 10 :(得分:0)

在您的网址中将“ localhost”替换为wifi连接ip例如: 'http://localhost:8000'=>'http://192.168.1.102:8000'。 您可以使用cmd> ipconfig(无线LAN适配器WI-FI。)从命令提示符处获取wifi ip。

var url = 'http://192.168.1.102:8000';
Future<String> getUnits(String category) async {
    var response = await httpClient.get('$url/$category');
    return response.body;
}

答案 11 :(得分:0)

在Ubuntu中执行

  1. 转到设置
  2. 点击网络标签
  3. 现在单击有线网络并复制IP地址,并替换为localhost

注意:您的连接应该是有线的,可能是 LAN USB Tethering ,而不是 Bluetooth Tethering (在我的情况下蓝牙网络共享给我错误)