Reputation: 20435
I'm following the Flutter Networking/HTTP tutorial to do a GET request to a server running on my localhost:8000. Visiting my localhost via my browser works fine. My code looks like this:
var url = 'http://localhost:8000';
Future<String> getUnits(String category) async {
var response = await httpClient.get('$url/$category');
return response.body;
}
This works fine when I point to any real URL, such as https://example.com
, but when I point to https://localhost:8000
or https://localhost
(or any variations of these), I get an error starting with:
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)
The port in the error above changes each time I reload the app. I looked in the http package code and it doesn't seem like there is a way to specify the port for the URL. How do I point to my localhost?
Upvotes: 104
Views: 168147
Reputation: 1338
If anyone interested... I've created this shell script gist to automatically detect connected Android devices (or emulators) using ADB (Android Debug Bridge) and set up reverse port mapping. This allows your mobile apps to safely access local machine APIs via http://localhost:$PORT
during development.
Upvotes: 0
Reputation: 169
Download ngrokand run ngrok http <your localhost URL>
(Please run this command in same location where you are download ngrok.exe)
EX ngrok http http://127.0.0.1:8000
After that you will get URL forwarder link like http://98b9-2402-4000-2380-c5a6-c5c9-86cf-ea4d-66af.ngrok.io
and change your base URL to this.
That's it! Enjoy and happy coding!!
Upvotes: 2
Reputation: 20221
Try forwarding the port of your emulator or the device to your computers port
e.g if your server is running on localhost:8000 then run this command
adb reverse tcp:8000 tcp:8000
this command actually redirects your phone’s port 8000 to your computer’s port 8000.And now your client should be able to talk to the server running locally
Tip: this also works if you want to run your flutter web app on your phone locally using
flutter run -d web-server
Upvotes: 27
Reputation: 101
If your backend is on LARAVEL, make sure to serve the domain to your IP address and port before using it on your flutter application
To serve do this
php artisan serve --host=192.168.1.100 --port=8000
That should solve the problem.
Upvotes: 5
Reputation: 184
if it is still not working even after pointing to 10.0.:2.2:port Most likely Android is not allowing the http traffic.
change the AndroidManifest.xml android/app/src/main
include
android:usesCleartextTraffic="true"
as shown below
<application
android:name="io.flutter.app.FlutterApplication"
android:label="app_name"
android:icon="@mipmvvap/ic_vvlauncher"
android:usesCleartextTraffic="true">
Upvotes: 7
Reputation: 189
I had the same problem, so apparently, I found a solution for this problem, so because you are in a virtual environment with your phone you cant use the localhost because the phone is not connected with your PC so simply, in my case, it worked, just use:
10.0.2.2:PORT
use this URL with your Port and it should work :)
Upvotes: 18
Reputation: 466
im using ubuntu 20LTS, laravel backend, flutter http package.
sudo apt-get install net-tools
. this package supports ifconfig
command to work.ifconfig
. then in the output search this line inet 192.168.43.217 netmask 255.255.255.0 broadcast 192.168.43.255
. then copy the inet 192.168.43.217
ip-address. also, note that ip-address will be different for you. for me it is 192.168.43.217
.cd your_laravel_project
and then run sudo php -S 192.168.43.217:81 -t public
to serve to inet address.static const _apiRoute = "http://192.168.43.217:81/api/login".
huh!! this worked for me.Upvotes: 6
Reputation: 3181
If you are trying to access localhost api through emulator, Change localhost to your IPV4 Address. And if you are running your api in Visual Studio set the app URL also to be IPV4 address. In my case I changed it from "localhost:5001" to 192.168.XX.XX:5001
if you don't change the backend it will return “Bad Request-Invalid Hostname” When accessing localhost from emulators
Upvotes: 3
Reputation: 3132
If you are using an Android emulator then localhost
on the emulator is not 127.0.0.0
it is 10.0.2.2
, so, on Android emulator you need to write https://10.0.2.2:8000
, the https://127.0.0.1:8000
will not work on real device too. because localhost
means something different on real device.
For more information on how to connect a Flutter app to localhost
on emulator or on a real device click on the link Connecting Flutter application to Localhost
Upvotes: 27
Reputation: 2042
to find ip is 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
start php
php -S 192.168.43.57:5000 index.php
than declare on future
Future<String> getIsi()async{
final res = await new Dio().get('http://192.168.43.57:5000/lihat-isi');
print('res.data');
return res.data;
}
an result is
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"}]
Upvotes: 5
Reputation: 51
Localhost via the computer browser I assume?
Using "http://localhost:port" in the Flutter code points to the local emulator device and not the local server running on your coomputer.
Point url to the IP Address of your server machine instead, that should solve the issue.
Upvotes: 4
Reputation: 1934
replace 'localhost' in your url to wifi connection ip e.g : 'http://localhost:8000' => 'http://192.168.1.102:8000'. you can get your wifi ip from command prompt with cmd>ipconfig (wireless LAN adapter WI-FI.
var url = 'http://192.168.1.102:8000';
Future<String> getUnits(String category) async {
var response = await httpClient.get('$url/$category');
return response.body;
}
Upvotes: 49
Reputation: 20435
Replacing the string localhost
with 10.0.2.2
resolved it for me, since I was running the code in the Android emulator, which is running in a VM. It's essentially a duplicate of this question.
Upvotes: 93
Reputation: 276957
Short answer: You can pass an Uri instead of a string as parameter
var client = createHttpClient();
client.get(new Uri.http("locahost:8000", "/category"));
Upvotes: 16