Wysyłanie requestu post

0

Cześć!
Oficjalnie zacząłem zabawę z androidem, niestety napotkałem problem którego nie umiem przeskoczyć.
Mianowicie potrzebuję wysłać request do serwera za pomocą post'a który będzie zawierał dane.
Więc z pomocą stackoverflow stworzyłem taki oto kod:

 public void onLogin(View v)  {
        String server_url = "server";

        String query = "domain=domain&password="+password.getText()+"&username="+login.getText();


        URL myurl = null;
        try {
            myurl = new URL(server_url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HttpsURLConnection con = null;
        try {
            con = (HttpsURLConnection)myurl.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            con.setRequestMethod("POST");
        } catch (ProtocolException e) {
            e.printStackTrace();
        }

        con.setRequestProperty("Content-length", String.valueOf(query.length()));
        con.setRequestProperty("Content-Type","application/x-www- form-urlencoded");
        con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)");
        con.setDoOutput(true);
        con.setDoInput(true);

        DataOutputStream output = null;
        try {
            output = new DataOutputStream(con.getOutputStream());
            output.writeBytes(query);
            output.close();
            DataInputStream input = null;
            input = new DataInputStream( con.getInputStream() );
            System.out.print("Res:");
            for( int c = input.read(); c != -1; c = input.read() )
                System.out.print( (char)c );
            input.close();
            System.out.println("Resp Code:"+con .getResponseCode());
            System.out.println("Resp Message:"+ con .getResponseMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Niestety po naciśnięciu buttonu który ma wykonać tą metodę aplikacja mi się wywala. Oto stack-trace:

 E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: proces, PID: 5199
                  java.lang.IllegalStateException: Could not execute method for android:onClick
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                      at android.view.View.performClick(View.java:5610)
                      at android.view.View$PerformClick.run(View.java:22265)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                      at android.view.View.performClick(View.java:5610) 
                      at android.view.View$PerformClick.run(View.java:22265) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
                   Caused by: android.os.NetworkOnMainThreadException
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                      at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
                      at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
                      at java.net.InetAddress.getAllByName(InetAddress.java:752)
                      at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
                      at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
                      at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
                      at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
                      at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:345)
                      at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
                      at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
                      at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
                      at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
                      at projekt.LoginActivity.print_content(LoginActivity.java:70)
                      at projekt.LoginActivity.onLogin(LoginActivity.java:52)
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                      at android.view.View.performClick(View.java:5610) 
                      at android.view.View$PerformClick.run(View.java:22265) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Disconnected from the target VM, address: 'localhost:8630', transport: 'socket'

Rozumiem z tego że nie mógł wykonać ww. metody. Jednakże jeśli wrzucę do niej jakiś toast bez problemu pojawia się na ekranie więc domyślam się że jest coś nie tak z czymś wewnątrz metody.
Z góry dziękuję za pomoc :) Byłbym również bardzo wdzięczny jeśli ktoś w wielkim skrócie wytłumaczył mi jak czytać stack trace. Znaczy rozumiem jak on działa, jednakże z tego nie umiem nic przeczytać oprócz tego że nie mógł wykonać tej metody.

0

Masz czarno na białym: Caused by: android.os.NetworkOnMainThreadException. W androidzie operacje związane z siecią muszą działać poza głównym wątkiem.

0

zastosuj asynctask a najlepiej to poczytaj o retroficie

0
Zimny Samiec napisał(a):

zastosuj asynctask a najlepiej to poczytaj o retroficie

Właśnie biblioteki wolałbym uniknąć ponieważ zwykły request muszę zrobić raz na cała aplikację. Reszta będzie leciała websocketem.

0
NickOver napisał(a):

Właśnie biblioteki wolałbym uniknąć ponieważ zwykły request muszę zrobić raz na cała aplikację. Reszta będzie leciała websocketem.

Używałem Retrofita i mogę powiedzieć, że nawet jak masz tylko jeden request, to nadal zaoszczędzisz czas i napiszesz mniej kodu, a znajomość narzędzia z pewnością przyda się na przyszłość.

1 użytkowników online, w tym zalogowanych: 0, gości: 1