POST an Server - Fehler bei OutputStreamWriter

  • Antworten:15
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 16:57:14 via Website

Hallo Leute

Ich versuche einige Daten an einen Server zu senden, damit er diese in einer MySql-DB speichern klan

Hier mein source

   // Datum speichern

            Datum = "2016-11-10";  // Ein Beispiel
            String url = "http://www.meineDomain.de/meinedatei.php";

            try {
                String textparam = "user=hauke&service=postspieltag&day="+URLEncoder.encode(datum, "UTF-8")+"&tische=0&gespielt=0";

                URL scriptUrl = new URL(url);
                HttpURLConnection connection = (HttpURLConnection) scriptUrl.openConnection();
                connection.setDoOutput(true);

                connection.setRequestProperty("Content-Type", "application/x-www-form_urlencoded");
                connection.setFixedLengthStreamingMode(textparam.getBytes().length);

                OutputStreamWriter contentWriter = new OutputStreamWriter(connection.getOutputStream());
                contentWriter.write(textparam);
                contentWriter.flush();
                contentWriter.close();

                connection.disconnect();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            datenHolen();
            list.invalidateViews();

Die anschließende Fehlermeldung lautet:

FATAL EXCEPTION: main
Process: stalort.de.t_schocker, PID: 8231
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:220)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:176)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:108)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:482)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:465)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:249)
at stalort.de.t_schocker.Spieltag.SpieltagAnlegen(Spieltag.java:140)
at stalort.de.t_schocker.Spieltag.access$100(Spieltag.java:44)
at stalort.de.t_schocker.Spieltag$3.onClick(Spieltag.java:96)
at android.view.View.performClick(View.java:5697)
at android.widget.TextView.performClick(TextView.java:10826)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Ich habs immer wieder gegooglet und auch mit
connection.setRequestMethod("POST");
funktioniert das nicht.

Kann mir jemand dabei weiterhelfen?

Danke und Gruß
Hauke

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 17:05:33 via Website

Hallo Hauke,

schau mal hier

 URL urlToRequest = new URL(Link);
 HttpURLConnection urlConnection = (HttpURLConnection)urlToRequest.openConnection();
 urlConnection.setDoOutput(true);
 urlConnection.setRequestMethod("POST");
 urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


 // Raus  damit
 String postParameters = "value1=" +"irgendwas" + "&value2=" +"irgendwas";
 PrintWriter outp = new PrintWriter(urlConnection.getOutputStream());
 outp.print(postParameters);
 outp.close();

 urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);
 urlConnection.connect();



 // Response
 BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
 String line;
 while ((line = rd.readLine()) != null)
 {
     Log.d(TAG,"RESPONSE :" + line );//+ "- "+Integer.toString(Link.length()));

 }

P.S ich gehe schon davon aus , dass das Ganze bei dir in einem Thread abläuft

— geändert am 01.11.2016, 17:09:54

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.11.2016, 17:05:36 via App

Netzwerkvorgänge immer in einen Thread/AsyncTask machen. Am besten mit Callback.
Oder gleich passende Http lib wie OkHttp, Ion oder Volley benutzen.

Edit: https://www.nextpit.de/forum/568854/tutorial-download-einer-webseite

— geändert am 01.11.2016, 17:06:19

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 18:29:10 via Website

Danke für die schnellen Antworten.

Habe das natürlich nicht im Thread abgearbeitet (schäm).
Habe versucht den Code anzuwenden. Bekomme aber wieder eine Fehlermeldung

 // Raus  damit
            String postParameters = "user=hauke&service=postspieltag&day="+datum2+"&tische=0&gespielt=0";
            PrintWriter outp = new PrintWriter(urlConnection.getOutputStream());
            outp.print(postParameters);
            outp.close();

HIER>>>     urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);
            urlConnection.connect();

Meldung:
Caused by: java.lang.IllegalStateException: Already connected
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.setFixedLengthStreamingMode(HttpURLConnectionImpl.java:635)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.setFixedLengthStreamingMode(HttpURLConnectionImpl.java:631)
at stalort.de.t_schocker.Spieltag$DatumSchreiben.doInBackground(Spieltag.java:311)
at stalort.de.t_schocker.Spieltag$DatumSchreiben.doInBackground(Spieltag.java:288)

Gruß Hauke

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 18:33:51 via Website

Hallo Hauke,

hast du nun das jetzt schon in einem Thread drin , oder versuchst du es eben noch so ... ??
Mach uns bitte über deinen Stand schlau , wir müssen schon irgendwie das Ganze nachvollziehen können :-) (um dir zu helfen)

P.S OHNE Thread kommst du nicht weiter und suchst dir den Wolf in den Fehlern :-)
(wir dann auch)

— geändert am 01.11.2016, 18:34:42

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 18:37:00 via Website

Ja ich weis , hatte das ganz vergessen und habe es vorhin geändert:

Hier der ganze COde:

 public class DatumSchreiben extends AsyncTask<Void,Void,Void>{

    @Override
    protected Void doInBackground(Void... voids) {

        try {
            String url = "http://www.meineDomain.de/MeinService.php";
            URL urlToRequest = new URL(url);
            HttpURLConnection urlConnection = null;

            urlConnection = (HttpURLConnection)urlToRequest.openConnection();

            urlConnection.setDoOutput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            Log.i("TASK ","2");

            // Raus  damit
            String postParameters = "user=hauke&service=postspieltag&day="+datum2+"&tische=0&gespielt=0";
            PrintWriter outp = new PrintWriter(urlConnection.getOutputStream());
            outp.print(postParameters);
            outp.close();

            urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);
            urlConnection.connect();

            // Response
            BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String line;
            while ((line = rd.readLine()) != null)
            {
                Log.d("TASK","RESPONSE :" + line );//+ "- "+Integer.toString(Link.length()));

            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        datenHolen();
        return null;
    }


}

Fehlen nur die Methoden post- und preexecute()

— geändert am 01.11.2016, 18:38:50

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 19:00:56 via Website

1) Der code oben läuft bei mir einwandfrei
2) was bedeutet das ? datenHolen();
3) ist das eine einmalige sache oder was continuierliches ??
4) wie startest du den Async ?

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 19:11:41 via Website

mit Datenholen kann man weglassen . ist eine leere Methode mit der anschließend die Daten noch einmal aktualisiert werden sollen. Hab's jetzt erst einmal weggelassen. gehört sowieso nicht in den Task

Deklaration :
DatumSchreiben myTask = new DatumSchreiben();

aufruf:

            myTask.execute();

Vielleicht Permissions?
gesetzt sind

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

— geändert am 01.11.2016, 19:16:30

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 19:23:30 via Website

du merkst , ich komme ein wenig ins schleudern , weil der Fehler ungewöhnlich ist .
Entweder hast du irgendwo noch oben was strubbeliges , oder es ist verzwickt .

a) bau dir mal einen constructor ein und übergebe da die url
b) Dann Starte mal das Ding mit

new DatumSchreiben (REQUESTED_URL).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

c) ich habe mir mal eben erlaubt, deinen Link anzupingen. Um deine php Abfrgae des Login zu umgehen ,bastel dir bitte mal zu probe lediglich ein PHP mit einem echo .
d) startest du ggf den Thread mehrmals ??

(Ausschlussverfahren)

— geändert am 01.11.2016, 19:25:45

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.11.2016, 19:27:09 via App

Ist das immernoch der Fehler von Oben?
Schwin so als sei die Verbindung schon odden und deswegen kannst du keine Fixe Länge setzen.
Du kannst das setFixedLenght auch mal weglassen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hauke Schrills

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 20:28:11 via Website

Habe jetzt eine neue Activity und eine neue test_svc.php (mit Logfile) geschrieben.
gab wieder einen Fehler bei
urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);

habe es dann weggelassen, dann werden aber keine Daten übergeben.

PHP Code:

<?php

$user="keine Daten übergeben!";

if(isset($_GET['user'])) {
    $user = $_GET['user'];
}

echo "Du hast folgebde Daten übergeben: user = ". $user;

$logfile = fopen("logfile.txt","a");
$date = date("d.m.y H:i:s");
fwrite ($logfile, $date." user: ".$user."\n");
fclose($logfile);
echo "
logfile gespeichert!";

?>

Android:

package stalort.de.t_schocker;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class SpieltagSpeichern extends AppCompatActivity {

DatumSchreiben myTask;
EditText etText;
String strText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spieltag_speichern);
    Button btnSave;
    etText = (EditText) findViewById(R.id.et_text);
    btnSave = (Button) findViewById(R.id.bt_testSave);
    btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            strText = etText.getText().toString();
            myTask = (DatumSchreiben) new DatumSchreiben("http://www.zonser.de/test_svc.php").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        }
    });

}

public class DatumSchreiben extends AsyncTask<Void,Void,Void> {
    String REQUESTED_URL;

    public DatumSchreiben(String REQUESTED_URL) {
        this.REQUESTED_URL = REQUESTED_URL;
    }

    @Override
    protected Void doInBackground(Void... voids) {

        try {
            //String url = "http://www.zonser.de/schocken_svc.php";
            URL urlToRequest = new URL(REQUESTED_URL);
            HttpURLConnection urlConnection = null;

            urlConnection = (HttpURLConnection)urlToRequest.openConnection();

            urlConnection.setDoOutput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


            // Raus  damit
            String postParameters = "user=hansPeter";
            PrintWriter outp = new PrintWriter(urlConnection.getOutputStream());
            outp.print(postParameters);
            outp.close();

// urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);
urlConnection.connect();

            // Response
            BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String line;
            while ((line = rd.readLine()) != null)
            {
                Log.d("TASK","RESPONSE :" + line );//+ "- "+Integer.toString(Link.length()));

            }

        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }


}

}

logcat:

11-01 20:26:51.497 4715-4715/stalort.de.t_schocker D/ViewRootImpl: ViewPostImeInputStage processPointer 0
11-01 20:26:51.687 4715-4715/stalort.de.t_schocker D/ViewRootImpl: ViewPostImeInputStage processPointer 1
11-01 20:26:51.687 4715-4715/stalort.de.t_schocker I/Timeline: Timeline: Activity_launch_request id:stalort.de.t_schocker time:38636704
11-01 20:26:51.747 4715-4715/stalort.de.t_schocker W/ResourcesManager: getTopLevelResources: /data/app/stalort.de.t_schocker-2/base.apk / 1.0 running in stalort.de.t_schocker rsrc of package null
11-01 20:26:51.777 4715-4715/stalort.de.t_schocker D/SecWifiDisplayUtil: Metadata value : none
11-01 20:26:51.777 4715-4715/stalort.de.t_schocker D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorView{93da040 I.E...... R.....ID 0,0-0,0}
11-01 20:26:51.837 4715-4715/stalort.de.t_schocker W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
11-01 20:26:51.837 4715-4715/stalort.de.t_schocker W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
11-01 20:26:51.867 4715-4715/stalort.de.t_schocker D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 72 - 0, 0) vi=Rect(0, 72 - 0, 0) or=1
11-01 20:26:51.877 4715-4715/stalort.de.t_schocker W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
11-01 20:26:51.897 4715-4715/stalort.de.t_schocker I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@2229fc3 time:38636917
11-01 20:26:52.157 4715-4715/stalort.de.t_schocker V/ActivityThread: updateVisibility : ActivityRecord{8c32688 token=android.os.BinderProxy@38afa62 {stalort.de.t_schocker/stalort.de.t_schocker.Liste}} show : false
11-01 20:26:53.977 4715-4715/stalort.de.t_schocker D/ViewRootImpl: ViewPostImeInputStage processPointer 0
11-01 20:26:54.207 4715-4715/stalort.de.t_schocker D/ViewRootImpl: ViewPostImeInputStage processPointer 1
11-01 20:26:54.217 4715-4974/stalort.de.t_schocker I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-01 20:26:54.217 4715-4974/stalort.de.t_schocker I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-01 20:26:54.267 4715-4974/stalort.de.t_schocker D/TASK: RESPONSE :Du hast folgebde Daten übergeben: user = keine Daten übergeben!
logfile gespeichert!

Vielleicht helfen die Daten

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 20:56:11 via Website

grrrrr,

eines habe ich noch gefunden

echo "Du hast folgebde Daten übergeben: user = ". $user;

Du liesst im Thread mit readln,das bedeuted, dass du eine Zeile erwartest - abgeschlossen mit CRLF

ändere mal dein PHP in

echo "Du hast folge*n*de Daten übergeben: user = ". $user."\r\n";

— geändert am 01.11.2016, 20:56:23

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 21:30:35 via Website

hab ich .
Aber es ändert ja nichts daran ,dass erst keine Daten übergeben werden.
Du kannst die Datei auch im Browser aufrufen
www.zonser.de/test_svc.php?user=HalloHierBinIch
das funktioniert.

Antworten
swa00
  • Forum-Beiträge: 3.704

01.11.2016, 21:54:10 via Website

Hallo Hauke,

lass die php bitte noch stehen , ich schau mir das morgen früh direkt an ....
Jetzt schau ich noch eben die "Löwen" zu ende :-)

Ich gebe dir dann Rückmeldung

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hauke Schrills

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 21:56:22 via Website

ok . danke auf jeden fall. Mache auch heute Feierabend.

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

01.11.2016, 23:24:31 via Website

Hat mir keine Ruhe gelassen.
Habe den Fehler gefunden:

Die Daten werden mit POST übergeben . Dann funktioniert $_GET nicht sondern

if(isset($_POST['user'])) {
$user = $_POST['user'];
}

Manchmal sieht man den Wald vor lauter Bäume nicht .

Jetzt funktioniert es . Vielen Dank für Eure Hilfe.

Gruß Hauke

Antworten