我正在跟随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:8000
或https://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指定端口。我如何指向我的本地主机?
答案 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:8000
, https://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时将返回“错误的请求-无效的主机名”
答案 7 :(得分:2)
我使用ubuntu 20LTS,laravel后端,抖动的http包。
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
命令运行。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
。192.168.43.217
,然后运行cd your_laravel_project
作为inet地址。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中执行
注意:您的连接应该是有线的,可能是 LAN , USB Tethering ,而不是 Bluetooth Tethering (在我的情况下蓝牙网络共享给我错误)