failed to connect to localhost/127.0.0.1 android - android

I am new to android development, and trying to call local .NET web api service in android via retrofit library. After starting my web api on IIS I am getting this error failed to connect to localhost/127.0.0.1 android.
When I did same thing as suggested http://themakeinfo.com/2015/04/retrofit-android-tutorial/, It's working fine, But my localhost service is not calling up from android
My service url is,
http://localhost:52511/api/Values/getAllStudents/5
and it is giving me output in XML format in browser too.
I have also try to call it with,
public interface gitapi {
#GET("/api/Values/GetProduct/{id}") //here is the other url part.best way is to start using /
public void getFeed(#Path("id") int id, Callback<gitmodel> response);
}
public class gitmodel {
public int studentId;
public String studentName;
public String studentAddress;
}
String API = "http://10.0.2.2:52511";
public void CallService(View view){
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(API).build();
gitapi git = restAdapter.create(gitapi.class);
int id = 5;
git.getFeed(id, new Callback<gitmodel>() {
#Override
public void success(gitmodel gitmodel, Response response) {
Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show();
}
#Override
public void failure(RetrofitError error) {
Toast.makeText(getApplicationContext(), "Errors", Toast.LENGTH_LONG).show();
}
});
}
but no luck.
Please tell me where do I need to change to make it work. ?
Response I am getting in browser is,
<ArrayOfstudents xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/APICall.Controllers">
<students>
<studentAddress>valsad</studentAddress>
<studentId>1</studentId>
<studentName>Keval</studentName>
</students>
<students>
<studentAddress>Hyderabad</studentAddress>
<studentId>2</studentId>
<studentName>Honey</studentName>
</students>
</ArrayOfstudents>

Instead of using 127.0.0.1:<PORT> use your local IP

There's nothing to do with retrofit library in your case.
It's about your network settings,
your phone and IIS server must be the same LAN.
You can follow as below.
Launch an AP on you IIS server;
Connecting the AP with your phone.
Sometimes you need to close security firewall on your IIS server.

I had the same problem as u (failed to connect to localhost/127.0.0.1).
First of all i recommend u to read this:
android developer's guide (main part of this on the image↓)
I had all of this, mean A, B and C. As C(emulator) i used a Genymotion.
And i solved my problem by changing Network Configurations on it.
IMPORTANT: my adress in baseURL were: "localhost:8099/"
Let's see it:
U should click on Settings → Network → check Use HTTP Proxy → input your IP adress and Port(in my situation it was 8099) → close. See it more details on image ↓

I have the same problem, and I resolve it by changing the IP address instead of 'localhost':
open cmd(if you are using windows): type 'ipconfig' and see your computer's ip.(make sure that your computer and your android device connect to the same network).
remove 'localhost' in the url and use the ip(ip of your computer in step 1).
run the project again and check

Actually this helped when using 2 apps on the same Android device (Android 9)
android:usesCleartextTraffic="true"

You can try this in androidmanifest.xml
android:usesCleartextTraffic="true"

Related

Avoid man in the middle (proxy) Android

I got a task at my job to reverse engineer an application.
I've been using Charles Proxy several times with other applications without any problems and have also tried Fiddler. I've always been able to monitor the request/responses made.
But the application that I'm trying now does now show any activity in either Charles or Fiddler. First I thought that they check the certificate and kill the connection but the application works as normal without any hiccups.
Is there any way for an application to be able to avoid the proxy settings or what am I missing?
I've been using apktool as well as dex2jar and found this peace of code. Probably not 100% correct but it can give you some clues of what happening.
public final void a(int paramInt1, int paramInt2)
{
this.b = paramInt2;
InetSocketAddress localInetSocketAddress = new InetSocketAddress(InetAddress.getByName(this.a), this.b);
while (true)
{
try
{
SSLContext localSSLContext = SSLContext.getInstance("TLS");
X509TrustManager[] arrayOfX509TrustManager = new X509TrustManager[1];
arrayOfX509TrustManager[0] = new c(this);
localSSLContext.init(null, arrayOfX509TrustManager, new SecureRandom());
this.e = ((SSLSocket)localSSLContext.getSocketFactory().createSocket());
this.e.connect(localInetSocketAddress, paramInt1);
this.d.clear();
if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.2"))
{
this.d.add("TLSv1.2");
String[] arrayOfString1 = (String[])this.d.toArray(new String[this.d.size()]);
SSLSocket localSSLSocket1 = this.e;
if (arrayOfString1.length > 0)
localSSLSocket1.setEnabledProtocols(arrayOfString1);
this.c.clear();
if (!Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_256_CBC_SHA"))
break label374;
this.c.add("TLS_RSA_WITH_AES_256_CBC_SHA");
String[] arrayOfString2 = (String[])this.c.toArray(new String[this.c.size()]);
SSLSocket localSSLSocket2 = this.e;
if (arrayOfString2.length > 0)
localSSLSocket2.setEnabledCipherSuites(arrayOfString2);
e.a().a(this.e.getLocalAddress().getAddress());
e.a().a(this.e.getLocalPort());
a(5000);
this.e.startHandshake();
a(0);
return;
}
}
catch (Exception localException)
{
throw new IOException(localException.toString());
}
if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.1"))
{
this.d.add("TLSv1.1");
}
else if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1"))
{
this.d.add("TLSv1");
continue;
label374: if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_128_CBC_SHA"))
this.c.add("TLS_RSA_WITH_AES_128_CBC_SHA");
else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("SSL_RSA_WITH_3DES_EDE_CBC_SHA"))
this.c.add("SSL_RSA_WITH_3DES_EDE_CBC_SHA");
else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("DES-CBC3-SHA"))
this.c.add("DES-CBC3-SHA");
}
}
}
Don't know that much about TLS 1.2 but I know its suppose to be more robust? But can it avoid the proxy?
I've also dumped the traffic using Wireshark, that worked but the information is encrypted, as expected, so its not much of use.
Any help would be appreciated.
This code will probably avoid proxy because is making direct socket. If you are using some higher level api, like HttpURLConnection, it respect proxy settings.
http://developer.android.com/reference/java/net/HttpURLConnection.html
You can try using SandroProxy to find out on which port communication is made.
http://code.google.com/p/sandrop/issues/detail?id=76
Go to HTTP tab and pres play button on acction bar
SandroProxy will listen on two new ports 8020 -> web , 8021 -> websockets for chrome devtools
start chrome from PC with url http your_device_ip:8020
Check Connection tab, last two columns are process uid and names(can be more than one)
To capture data you can also use SandroProxy and force iptable redirects. You will need rooted phone.
btw: send by sandroproxy support :)
You could try using something like adb forward 80 3456 against the device or emulator to have all port 80 traffic redirected to 3456 on your workstation. Then have your proxy listen on that port.

Proper way to call a REST service in Phonegap

I've taken an AngularJS web page that is able to call my REST service using GET, and put this code into my Android/Phonegap project and the rest service isn't called.
so this code below works standalone but not within phone application
$http.get('http://localhost:40884/api/sampleapi/get').success(function (data) {
alert("cool");
$scope.posts = data;
$scope.loading = false;
})
.error(function (request, status, error) {
alert("err");
console.log(data);
$scope.error = "An Error has occured while loading posts!";
$scope.loading = false;
});
I've checked the manifest has
and the res/config.xml file has
<access origin="*"/> <!-- allow local pages -->
But these haven't made a difference. Trying to trace out the request,status,error variables only retrieve a 0 for the error variable.
Any ideas about what to try here appreciated
Cheers
M
I believe localhost is your computer, and since your phone or emulator is a different machine, you need to replace localhost with your computer's local ip address(something like 192.168.1.10). Later when you want to make it work even on different networks you need to put your api online(like a hosting)
I suggest that you assign a static local ip to your computer and use that address instead of localhost all the time.

Android How to check URL name or IP is rechable

My code is as follow:
public chkRechable(String hostNameOrIp) {
boolean isRechable = InetAddress.getByName(hostNameOrIp).isReachable(30);
return isRechable;
}
Parameter can be "http://192.168.0.77:8080/ws/api/customer/5" or "http://example.com:8080/ws/api/customer/5"
But everytime it's returning false although I can browse the URL.
What do you mean "reachable"?
If "open the page" means "reachable", you can just try to use an HTTP connection to connect to it. If you got exceptions: your net work might down; you cannot connect to the host;
Then you shall check the http return code, to see if there are 404 or other errors.

Challenge with Android communicating to GAE using restlet

I'm using Eclipse to (try to) build an Android client to get reuse a restlet service I developed using GAE and GWT.
My service is running at
http://127.0.0.1:8888/abc/audits
I can test this by going directly to this url, and by using my GWT client - both work.
However, the following code returns a communication error
private AuditsResource resource;
private Audits audits;
ClientResource cr = new ClientResource("http://127.0.0.1:8888/abc/audits");
resource = cr.wrap(AuditsResource.class);
try {
// Get the remote contact
audits = resource.retrieve();
// The task is over, let the parent conclude.
handler.sendEmptyMessage(0);
} catch (Exception e) {
Message msg = Message.obtain(handler, 2);
Bundle data = new Bundle();
data.putString("msg", "Cannot get the contact due to: "
+ e.getMessage());
msg.setData(data);
handler.sendMessage(msg);
}
I have no idea where to look next. I've instrumented the server implementation of AuditsResource, and it is never touched (by the Android application).
The AuditsResource class has one method, to keep things simple for now
#Get
public Audits retrieve();
It appears the problem is that the Andriod Emulator cannot connect to either 127.0.0.1 or 10.0.2.2. The solution is to use your PC's IP address.
I am able to connect from Android to my local Google App Engine through Android/Restlet using 10.0.2.2 instead of localhost.

getjson response returns null in phonegap (android)

$.getJSON("http://localhost:8080/v1/message",
function(data) {
console.log(data);
alert("message"+data);//this alert stmt is displayed it means that
the service call is getting executed
});
service method
#RequestMapping(method = RequestMethod.GET,
value = "/message" )
#ResponseStatus(HttpStatus.OK)
#ResponseBody
public String message()
{
return "jasdknsd";
}
I am getting response of this call as null please help me out if I am doing something wrong in the service method and I have both of them in same network because of which I am not using callback
Connection to localhost is not supported.
http://code.google.com/p/android/issues/detail?id=133
127.0.0.1 is the emulated system's own loopback interface, not the one running on
your host development machine.
within the Android system, one should use 10.0.2.2 which is an alias specifically
setup to contact your host 127.0.0.1
use 10.0.2.2 instead of localhost:8080

Categories

Resources