2016-05-02 6 views
0

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)  
+0

Meinen Sie, dass Sie eine Ausnahme während der Ausführung von obj.openConnection() erhalten? Welche Ausnahme genau? – kit

+0

Was ist die Ausnahme ?, Denken Sie daran, Sie sollten Ihre Methode requestServer in einem zweiten Thread wie und AsynckTask ausführen. – Crash

+0

Es ist eine IllegalStateException, ich kann die stackTrace drucken, wenn Sie möchten –

Antwort

0

Versuchen requestServer() mit einem AsyncTask wickeln. Führen Sie diese Methode in doInBackground()

+1

Ich hatte es schon vorher probiert und es hat nicht funktioniert. Als ich den Code jetzt schrieb, um ihn zu testen und den StackTrace an euch auszudrucken, funktionierte das durch ein Wunder! Ich verwendete Code direkt von der API (Spring) (es war das erste, das ich versuchte) und es hatte vorher nicht funktioniert, aber jetzt ist es funktionsfähig! Danke für die Hilfe –