Ich habe einen Spring Restful-Server funktionsfähig. Es akzeptiert Anfragen von jedem Browser und von einem Java-Client, den ich gemacht habe, um es zu testen.Android-Client, der keine Verbindung zum REST-Server herstellt
Das Problem ist, wenn ich versuche, es mit Android zu verbinden, ob es auf dem Emulator oder auf einem Smartphone ist.
Ich habe diesen einfachen Code in meinem Java-Client den Server zu testen:
public void requestServer() throws IOException {
String url = "http://localhost:8080/checkPoints?username=john";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
}
Es funktioniert perfekt. Wenn ich es debugge, sehe ich, dass con hat den HTTP-Response-Code 200, und die Antwort von der Seite ist genau die Anzahl der Punkte, die John hat.
Aber wenn ich versuche, es auf Android mit dem gleichen Code aktiviert wird, wenn eine Schaltfläche geklickt wird:
public void requestServer(View view) throws IOException {
String url = "http://10.0.2.2:8080/checkPoints?username=joao";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
}
Es bricht immer in dieser Zeile aus:
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
Wenn ich es debuggen , Ich sehe, dass der HTTP-Response-Code ist -1, anstatt 200. Ich habe versucht, meine interne Netzwerk-IP (192.168.1.79 in meinem Fall), und es funktioniert nicht. Ich habe hier in Stackoverflow in vielen Threads gesucht und eine Menge Code ausprobiert, den Benutzer hatten, und in all diesen Code-Stücken bricht es immer im selben Code aus, nämlich obj.openConnection().
Ich habe die Erlaubnis für das Internet im Manifest, es wird nicht deswegen sein.
Was könnte es sein?
Edit: Hier ist die stacktrace
5-02 19:19:38.109 2769-2769/pt.androidrestfulclient E/AndroidRuntime: FATAL EXCEPTION: main
Process: pt.androidrestfulclient, PID: 2769
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:289)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
at java.net.Socket.connect(Socket.java:882)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
at com.android.okhttp.Connection.connect(Connection.java:152)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
at pt.ulisboa.tecnico.cmov.androidrestfulclient.MainActivity.requestServer(MainActivity.java:50)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Meinen Sie, dass Sie eine Ausnahme während der Ausführung von obj.openConnection() erhalten? Welche Ausnahme genau? – kit
Was ist die Ausnahme ?, Denken Sie daran, Sie sollten Ihre Methode requestServer in einem zweiten Thread wie und AsynckTask ausführen. – Crash
Es ist eine IllegalStateException, ich kann die stackTrace drucken, wenn Sie möchten –