【问题标题】:How to point to localhost:8000 with the Dart http package in Flutter?如何使用 Flutter 中的 Dart http 包指向 localhost:8000?
【发布时间】:2018-05-02 12:35:05
【问题描述】:

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

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

当我指向任何真实的 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)

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

【问题讨论】:

标签: http dart localhost flutter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这行得通。但是您必须确保将绑定添加到您的本地主机或在 192.168.1.102:8000 上运行您的应用程序,否则在从模拟器访问本地主机时会给出“错误请求 - 无效主机名”
    • 新的颤振将不接受 url 的字符串。你需要 :: var url=Uri.parse(your_string_path)
    • 嗨,我尝试将主机更改为我的 ipv4 地址或 localhost 或 wifi ip 后仍然遇到同样的问题...问题仍然存在...您能告诉我如何解决它?不是:使用烧瓶作为后端
    【解决方案3】:

    如果你使用的是安卓模拟器,那么模拟器上的localhost不是127.0.0.0而是10.0.2.2,所以,在安卓模拟器上你需要写https://10.0.2.2:8000https://127.0.0.1:8000不会在真实的设备也。因为localhost 在真实设备上意味着不同的东西。

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

    【讨论】:

    • 谢谢!我搞砸了一段时间,这对我来说非常好!
    【解决方案4】:

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

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

    【讨论】:

    • 我认为 httpClient.get 只能接受一个输入参数 - 我传递了你的答案,它说Too many positional arguments: 1 expected, but 3 found.
    • 哦,你使用的是createHttpClient 而不是new HttpClient 我的错。已编辑
    • 这也导致了随机选择端口的 IO 错误。我认为它通常会起作用,但我在 Android 模拟器中运行代码,该模拟器在 VM 中运行。所以显然我应该只指向 10.0.2.2。
    • 我有同样的错误这是我的代码,我能够在浏览器中得到响应 Future connect() async { var httpClient = new HttpClient(); var request = await httpClient.get('127.0.0.1', 3000, "/api"); var response = await request.close();
    • 我认为实际问题是由 Android 模拟器上的 localhost 引用引起的
    【解决方案5】:

    我遇到了同样的问题,显然,我找到了解决这个问题的方法,所以因为你的手机处于虚拟环境中,所以你不能使用本地主机,因为手机没有与你的 PC 连接,所以很简单,在我的案例,它有效,只需使用:

    10.0.2.2:PORT 
    

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

    【讨论】:

    • 谢谢。为我工作。
    • 如何获取端口?
    • 我使用了10.0.2.2:8000/login,但它给出了这个错误,SocketException: OS Error: Connection denied, errno = 111, address = 127.0.0.1, port = 39692
    【解决方案6】:

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

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

    adb reverse tcp:8000 tcp:8000

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

    提示:如果您想在手机上使用 flutter run -d webserver more details here 运行您的 Flutter Web 应用程序,这也适用

    【讨论】:

      【解决方案7】:

      查找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
      

      启动 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"}]
      

      【讨论】:

        【解决方案8】:

        我使用的是 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.217 ip 地址。另外,请注意,您的 ip-address 会有所不同。对我来说是192.168.43.217
        • 第 3 步:转到您的 laravel 项目 cd your_laravel_project,然后运行 ​​sudo php -S 192.168.43.217:81 -t public 以服务到 inet 地址。
        • 第4步:然后从颤振static const _apiRoute = "http://192.168.43.217:81/api/login". 啊!!这对我有用。

        【讨论】:

          【解决方案9】:

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

          更改 AndroidManifest.xml 安卓/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】:

            通过我假设的计算机浏览器进行本地主机?

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

            将 url 指向您的服务器机器的 IP 地址,这应该可以解决问题。

            【讨论】:

              【解决方案11】:

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

              如果你不改变后端,当从模拟器访问本地主机时,它会返回“Bad Request-Invalid Hostname”

              【讨论】:

              • 谢谢,这对我帮助很大,因为在模拟器上运行应用程序会使我的电脑变慢,而在真实设备上运行它时效果非常好我的意思是应用程序运行流畅,电脑也一样.
              【解决方案12】:

              如果您的后端在 LARAVEL 上,请确保在您的 Flutter 应用程序上使用它之前将域提供给您的 IP 地址和端口

              为了服务做到这一点

              php artisan serve --host=192.168.1.100 --port=8000

              这应该可以解决问题。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-12-17
                • 1970-01-01
                • 2011-09-28
                • 2020-12-18
                • 1970-01-01
                • 1970-01-01
                • 2016-04-07
                相关资源
                最近更新 更多