Cannot connect to localhost API from Android app
Asked Answered
O

11

18

I am new to Django. I have created an API named http://127.0.0.1:8000/api/update/1/ and it works perfectly in the browser and on the Postman app.

However, when I am trying to access the API from the Android app it is returning NULL.

The Android code works when the API is the following:

http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66

However, it does not work when the API is the following, even if the following API works just fine from my browser running in the same PC and from the Postman application.

http://127.0.0.1:8000/api/update/1/

I am attaching the code where API call is made.

protected String doInBackground(String... args) {
    String xml = "";
    String api = "http://127.0.0.1:8000/api/update/1/"; // returns NULL works in Postman app and in the browser
    // String api = "http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66"; // works in all places
    String urlParameters = "";
    xml = Function.excuteGet(api, urlParameters);
    return  xml;
}
Obadiah answered 17/8, 2018 at 6:49 Comment(6)
are you sure your device network connected with to pc? or turn off your firewallHyperthermia
127.0.0.1 is the ip address of the device/pc itself. Not that of any other computer or device. Use the ip of your pc instead.Goldsberry
and it works okay in the browser . In the browser on that pc. Not in a browser on your device.Goldsberry
127.0.0.1 is ip address of the same device you are making request from. so requesting 127.0.0.1 from the phone will connect to the phoneMethylal
Possible duplicate of How to connect to my http://localhost web server from Android Emulator in EclipsePeriwig
You may check this #50295013Aniela
A
30

If you are testing your application from a real android device then you need to put the IP address of your PC while you are trying to connect to your Django server through APIs. And yes, you need to be in the same network as well. So you need to check the following things.

  1. Make sure that the PC (where you are running the server) and the Android device (where you are testing your application) are in the same network (connected with same Wifi network maybe).

  2. Make sure you are connecting to the IP address of your PC where the server is running. For example, right now, the IP address of your PC is 192.168.0.100. Then, you need to connect to this IP address and call your API like the following.

    http://192.168.0.100:8000/api/update/1/
    
  3. Make sure you are accepting requests to the port 8000 in your PC. Check your Firewall configuration if it is blocking any incoming requests to the 8000 port. If it is found blocking, then please allow an incoming request to the 8000 port using the following.

    sudo ufw allow 8000/tcp
    

If there is nothing which is helping you, then please check your Android code to check if the API calling is okay. I would strongly recommend using Volley for API calls suggested in developers documentation.

Last, but not the least, please check if you have necessary permission in your AndroidManifest.xml file. You need to add the following permission to grant your application to use the internet.

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Admit answered 17/8, 2018 at 9:13 Comment(6)
Thanks! As a newbie, this really helping me a lot.Roentgenograph
Glad to know that I could help. You are most welcome!Admit
@ReazMurshed Hi ,I have tried what you suggested. But still facing issue.#63610968Spar
how to figure out ip of my laptop? can i connect to my laptop from my phone if both devices use the same wifi ?Apices
#13322985 You can find something similar if you are on Windows.Admit
Thank you for this! Do you happen to know if there is an option to recognize that you connect real device or emulator? Like maybe some compiler directive?Reinareinald
P
18

To be able to connect your localhost (I assume you are using emulator, I can edit the answer if not)

You need to use the following url:

http://10.0.2.2:8000/
Prevent answered 17/8, 2018 at 15:48 Comment(0)
H
7

Please run your django development server using the following command.

python manage.py runserver 0.0.0.0:8000

Once you get it running, in a new terminal window find out the ip address of your computer in your wifi/network subnet using the following command

Ipconfig or ifconfig (depends on your OS)

Then change the base url of your api from 127.0.0.1 to the ip you found in the above step. Now connect the android phone in which your app is being tested to your same wifi or network to which the computer running django is connected. Now you can request and receive response.

127.0.0.1 is the home of your system, your android app will not be able to access that. You need to do it like this.

Herold answered 17/8, 2018 at 12:9 Comment(0)
A
4

1)Andoird manifest to put internet permission and network acceess 2) if using Android simulator on local machine. Use 10.0.2.2. alias created by default for 127.0.0.1 i.e losthoast.

Its works for me

Anticipative answered 22/1, 2021 at 7:2 Comment(0)
S
1

For me, the problem was that my server was running on HTTP, not HTTPS. Once I set up my SSL certificate, everything worked fine. I'm using Expo and strangely the API works when in development mode through the Expo app, but after I build an APK it fails to connect to any non-HTTPS server.

Selfevident answered 7/1, 2022 at 14:53 Comment(1)
This does not really answer the question. If you have a different question, you can ask it by clicking Ask Question. To get notified when this question gets new answers, you can follow this question. Once you have enough reputation, you can also add a bounty to draw more attention to this question. - From ReviewBout
P
0

The API isn't working in POSTMAN I tried http://127.0.0.1:8000/api/update/1/ shows an error because it requires some params to be inputted.

in this case, http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66 the required params have been provided to the API, ie source, sortBy & apiKey

Periwig answered 17/8, 2018 at 6:55 Comment(2)
This API is available in the local environment. How come you can get the result from your end without running the server in the same local environment?Admit
futurestud.io/tutorials/… check if this helpsPeriwig
S
0

It is possible to call local api with some minor changes.These were the steps I did to hit the local django api from my android app.

  • You need to be connected to same network. Better create a hotspot from your pc or laptop and connect android with it
  • Create static IP from your system. If you are on VM you may require additional network adapter. Please google it as there are plenty of videos and blogs on the same.
  • Host django on the created local IP.

You are then good to go with your android app.

Slacker answered 17/8, 2018 at 9:20 Comment(0)
H
0

You can not access a local api outside from that local device. 127.0.0.1 is the local address of its own. If you want to access the api outside from local device, replace the ip with the ip that is open to outside. For example, 192.168.43.2 is a ip that is accessible from outside. Update your api with the accessible ip(use ifconfig or ipconfig in terminal to obtain the ip and use that ip to access from outsid?). Also, please make sure if you have proper permission in AndroidManifest.xml file.

Hodges answered 17/8, 2018 at 12:40 Comment(2)
I think there are some problems with the API call. I suggested him to use Volley for simpler API calling.Admit
I don't know what was the problem with how I called the API but using volley it worked. I tried using 192.168.0.100 instead of 127.0.0.100 and run Django server on 192.168.0.1. On the mobile browser, it worked but not on the Andriod app. Then I used volley and the problem was solved.Obadiah
C
0

If you're running app on physical Android device,

  1. Make sure both are connected to the same network.
  2. Allow port which you're using in Inbound rules of Windows defender firewall.
  3. Make sure you're using http only when running server locally.
  4. Type ipconfig on command prompt to get the ip address of the network. Specifically use the Wireless LAN adapter Wi-Fi: IPv4 Address
Crier answered 9/1, 2024 at 15:36 Comment(0)
C
0

If you're using Android 9 (Pie) or above, you might need to disable network security configurations. Add a network security configuration file and reference it in your AndroidManifest.xml.

Create or update the file in the android folder: app/res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.100</domain>
    </domain-config>
</network-security-config>

(assuming your pc's ip address is 192.168.0.100. change appropriately)

Then reference it in your AndroidManifest.xml:

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
    ...
</application>
Crenation answered 20/6, 2024 at 8:49 Comment(0)
T
-1

In local host You must start the server and also do app development in same system then only it works for you..

Testicle answered 17/8, 2018 at 7:30 Comment(1)
Nonsense. Then Django would be of little use.Goldsberry

© 2022 - 2025 — McMap. All rights reserved.