Mon application qui utilise Retrofit (v1.6.1) pour se connecter à REST ne peuvent pas se connecter à mon serveur Web local (fonctionnant sur localhost
), c'est l'erreur que je suis obtenir.
C'est à l'intérieur de l'émulateur Nexus4 (v4.3), j'utilise Android Studio pour le développement et j'ai ajouté Android.permission.INTERNET
& Android.permission.ACCESS_NETWORK_STATE
autorisations dans le fichier manifeste.
L'erreur indique qu'il a attendu 15 secondes, mais ce n'est pas le cas, il sort immédiatement.
07-13 15:57:53.947 820-840/it.test.Android.app.activity D/Retrofit﹕ ---> HTTP POST http://localhost:3000/app/auth/signin
07-13 15:57:54.132 820-840/it.test.Android.app.activity D/Retrofit﹕ Content-Type: application/json; charset=UTF-8
07-13 15:57:54.132 820-840/it.test.Android.app.activity D/Retrofit﹕ Content-Length: 44
07-13 15:57:54.157 820-840/it.test.Android.app.activity D/Retrofit﹕ {"auth":{"email":"steve","password":"pass"}}
07-13 15:57:54.387 820-840/it.test.Android.app.activity D/Retrofit﹕ ---> END HTTP (44-byte body)
07-13 15:57:54.657 820-840/it.test.Android.app.activity D/Retrofit﹕ ---- ERROR http://localhost:3000/app/auth/signin
07-13 15:57:54.857 820-840/it.test.Android.app.activity D/Retrofit﹕ Java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 3000) after 15000ms: isConnected failed: ECONNREFUSED (Connection refused)
at libcore.io.IoBridge.isConnected(IoBridge.Java:223)
at libcore.io.IoBridge.connectErrno(IoBridge.Java:161)
at libcore.io.IoBridge.connect(IoBridge.Java:112)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
at Java.net.Socket.connect(Socket.Java:842)
at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:76)
at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
at libcore.net.http.HttpEngine.connect(HttpEngine.Java:311)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:81)
at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.Java:197)
at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.Java:68)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.Java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.Java:321)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.Java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.Java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.Java:42)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
at retrofit.Platform$Android$2$1.run(Platform.Java:142)
at Java.lang.Thread.run(Thread.Java:841)
Caused by: libcore.io.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
at libcore.io.IoBridge.isConnected(IoBridge.Java:208)
at libcore.io.IoBridge.connectErrno(IoBridge.Java:161)
at libcore.io.IoBridge.connect(IoBridge.Java:112)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
at Java.net.Socket.connect(Socket.Java:842)
at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:76)
at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
at libcore.net.http.HttpEngine.connect(HttpEngine.Java:311)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:81)
at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.Java:197)
at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.Java:68)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.Java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.Java:321)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.Java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.Java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.Java:42)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
at retrofit.Platform$Android$2$1.run(Platform.Java:142)
at Java.lang.Thread.run(Thread.Java:841)
07-13 15:57:54.857 820-840/it.test.Android.app.activity D/Retrofit﹕ ---- END ERROR
J'ai résolu le problème, je dois utiliser 10.0.2.2
au lieu de localhost
pour me connecter à mon serveur local.
Je l'ai trouvé ici - http://developer.Android.com/tools/devices/emulator.html#networkaddresses
Sur votre téléphone, connectez-vous à localhost:3000
signifie "se connecter au port 3000 sur l'interface réseau locale" - qui est l'interface locale du téléphone, pas le port 3000 du PC auquel votre téléphone est connecté. Il n'y a rien à écouter sur le port 3000 du téléphone, vous obtenez donc une erreur de connexion refusée.
Ce que vous essayez de faire est (probablement difficile à deviner sans plus d'informations), c'est de vous connecter du téléphone au port 3000 sur votre PC. Vous devez donc changer l'adresse à laquelle vous vous connectez de localhost
à l'adresse du PC. Dans le cas de l'émulateur, ce serait 10.0.2.2 (qui est l'hôte local du PC). Voir les informations de mise en résea pour référence.