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

Mar*_*ary 15 http localhost dart flutter

我正在按照Flutter Networking/HTTP教程对我的localhost:8000上运行的服务器执行GET请求.通过我的浏览器访问我的本地主机工作正常.我的代码看起来像这样:

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

当我指向任何真实的URL时,这可以正常工作,例如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)
Run Code Online (Sandbox Code Playgroud)

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

mah*_*mnj 25

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

\n

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

\n

adb reverse tcp:8000 tcp:8000

\n

这个命令实际上将你的手机\xe2\x80\x99s端口8000重定向到你的计算机\xe2\x80\x99s端口8000。现在你的客户端应该能够与本地运行的服务器通信

\n

提示:如果您想使用\n在手机上本地运行 Flutter Web 应用程序,这也适用

\n
flutter run -d web-server\n
Run Code Online (Sandbox Code Playgroud)\n

更多详细信息请点击这里

\n


Mar*_*ary 21

更换字符串localhost10.0.2.2解决这对我来说,因为我是跑在Android模拟器,这是在虚拟机上运行的代码。它本质上是这个问题的重复。


小智 19

将 url 中的“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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这会起作用。但是你必须确保你添加了一个绑定到你的 locahost 或者你在 192.168.1.102:8000 上运行你的应用程序,否则当从模拟器访问 localhost 时,它会给出“Bad Request-Invalid Hostname” (3认同)

Sed*_*ush 14

如果您使用的是 Android 模拟器,那么localhost在模拟器上就不是127.0.0.010.0.2.2,因此,在您需要编写的 Android 模拟器上https://10.0.2.2:8000,它https://127.0.0.1:8000也不会在真实设备上运行。因为localhost在真实设备上意味着不同的东西。

有关如何将 Flutter 应用程序连接到localhost模拟器或真实设备的更多信息,请单击链接将 Flutter 应用程序连接到本地主机


Rém*_*let 12

简短回答:您可以传递 Uri 而不是字符串作为参数

      var client = createHttpClient();
      client.get(new Uri.http("locahost:8000", "/category"));
Run Code Online (Sandbox Code Playgroud)

  • 这也导致了随机选择端口的 IO 错误。我认为它通常会起作用,但我在 Android 模拟器中运行代码,该模拟器在 VM 中运行。所以显然我应该只指向 10.0.2.2。 (6认同)
  • 我遇到了同样的错误,这是我的代码,我能够在浏览器中获取响应 Future connect() async { var httpClient = new HttpClient(); var request = wait httpClient.get('127.0.0.1', 3000, "/api"); var 响应 = 等待请求.close(); (2认同)

小智 7

我遇到了同样的问题,很明显,我找到了解决此问题的方法,因此,由于您使用手机处于虚拟环境中,因此无法使用本地主机,因为手机未与您的 PC 如此简单地连接,就我而言,它工作,只需使用:

10.0.2.2:PORT 
Run Code Online (Sandbox Code Playgroud)

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

  • 我使用http://10.0.2.2:8000/login,但是它给出了这个错误,SocketException:操作系统错误:连接被拒绝,errno = 111,地址= 127.0.0.1,端口= 39692 (4认同)

Lal*_*mar 6

我使用 ubuntu 20LTS、laravel 后端、flutter http 包。

  • 第1步:在终端中运行sudo apt-get install net-tools. 这个包支持ifconfig命令工作。
  • 第2步:在终端中运行ifconfig. 然后在输出中搜索这一行inet 192.168.43.217 netmask 255.255.255.0 broadcast 192.168.43.255。然后复制inet 192.168.43.217ip地址。另请注意,您的 IP 地址将有所不同。对我来说是的192.168.43.217
  • 第三步:进入你的laravel项目cd your_laravel_project,然后运行sudo php -S 192.168.43.217:81 -t public服务到inet地址。
  • 第四步:然后从 flutter 开始static const _apiRoute = "http://192.168.43.217:81/api/login". 吧!!这对我有用。


小智 6

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

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

包括

 android:usesCleartextTraffic="true" 
Run Code Online (Sandbox Code Playgroud)

如下所示

<application
        android:name="io.flutter.app.FlutterApplication"
        android:label="app_name"
        android:icon="@mipmvvap/ic_vvlauncher"
        android:usesCleartextTraffic="true">
Run Code Online (Sandbox Code Playgroud)


mal*_*aki 5

查找ip是ifconfigmac/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
Run Code Online (Sandbox Code Playgroud)

启动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;
    }
Run Code Online (Sandbox Code Playgroud)

结果是

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"}]
Run Code Online (Sandbox Code Playgroud)