JsonObject übergeben an PHP und enpacken

  • 23 Antworten
  • Neuester Beitrag
Diskutiere JsonObject übergeben an PHP und enpacken im Android App Entwicklung im Bereich Betriebssysteme & Apps.
A

Anojo

Neues Mitglied
Hi an alle,:sad:

hab über Android ein JsonObject erstellt das ich an PHP übergeben will und anschließend will ich wieder was zurück geben.

Das Json mach ich so...
Code:
private JSONObject postList = new JSONObject();

if(fertig || notFertig == 30){

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("postList", postList.toString()));
 
 
        try {
            Log.d(TAG, "Verbindung zur Datenbank wird hergestellt!");
            
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("https://localhost/test.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Content-type", "application/json");
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent(); 
        } catch (Exception e) {...
...
...
...
    } else {
            try {
                postList.put(""+ notFertig, id);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
 
            notFertig++;
            
        }

Dann hier noch mein PHP Script...

PHP:
... 
.... 

$list = $_REQUEST['postlist']; 
$list = json_decode(utf8_encode($list)); 
$in = ""; 

for($i = 0; $i <= 30; $i++){ 

if($list[$i] != ""){ 
    if($in !=""){ 
        $in += ', '; 
    } 
} 

$in += $list[$i]; 
} 

$q=mysql_query( "SELECT * FROM daten WHERE `id` IN ($in)"); 
... 
...
postList = {"19":74,"17":71,"18":73,"15":67,"16":68,"13":65,"14":66,"11":63,"12":64,"21":76,"20":75,"22":78,"23 ":79,"24":84,"25":103,"26":112,"27":113,"28":114,"29":118,"3":54,"2":53,"10":62,"1":34,"0":32,"7":58 ,"6":57,"5":56,"4":55,"9":60,"8":59}


Zurück bekomme ich ein false statt der erhofften Daten aus der Datenbank.
Was mach ich falsch? :confused2: :confused2:

Gruß Toni
 
Zuletzt bearbeitet:
A

amfa

Dauergast
Ich hab keine Ahnung von PHP, aber lass dir doch den Fehler ausgeben.

if (!q) {echo mysql_error()}

Dann weißt du vielleicht warum du einen Fehler bekommst.
 
A

Anojo

Neues Mitglied
echos kommen aber nicht einfach so auf Android an.

hab auch schon versuch das über echo raus zu bekommen aber es kommen nur Fehler oder Daten an.

Das mit dem PHP Debugen hab ich langsam aufgegeben weil ich es nicht eingerichtet bekomme.

Aber trotzdem danke!
 
A

amfa

Dauergast
dann ruf die seite doch einfach mal so auf..
https://localhost/test.php?postlist=%7B%2219%22%3A74%2C%2217%22%3A71%2C%2218%22%3A73%2C%2215%22%3A67%2C%2216%22%3A68%2C%2213%22%3A65%2C%22%2014%22%3A66%2C%2211%22%3A63%2C%2212%22%3A64%2C%2221%22%3A76%2C%2220%22%3A75%2C%2222%22%3A78%2C%22%2023%20%22%3A79%2C%2224%22%3A84%2C%2225%22%3A103%2C%2226%22%3A112%2C%2227%22%3A113%2C%2228%22%3A114%2C%22%2029%22%3A118%2C%223%22%3A54%2C%222%22%3A53%2C%2210%22%3A62%2C%221%22%3A34%2C%220%22%3A32%2C%227%22%3A%2058%20%2C%226%22%3A57%2C%225%22%3A56%2C%224%22%3A55%2C%229%22%3A60%2C%228%22%3A59%7D

Ansonsten guck mal hier:
TcpTrace
Das dürte dir beim debuggen auch helfen.

 
A

Anojo

Neues Mitglied
dann ruf die seite doch einfach mal so auf..
https://localhost/test.php?postlist={"19":74,"17":71,"18% 22%3A73%2C%2215%22%3A67%2C%2216%22%3A68%2C%2213%22 %3A65%2C%22%2014%22%3A66%2C%2211%22%3A63%2C%2212%2 2%3A64%2C%2221%22%3A76%2C%2220%22%3A75%2C%2222%22% 3A78%2C%22%2023%20%22%3A79%2C%2224%22%3A84%2C%2225 %22%3A103%2C%2226%22%3A112%2C%2227%22%3A113%2C%222 8%22%3A114%2C%22%2029%22%3A118%2C%223%22%3A54%2C%2 22%22%3A53%2C%2210%22%3A62%2C%221%22%3A34%2C%220%2 2%3A32%2C%227%22%3A%2058%20%2C%226%22%3A57%2C%225% 22%3A56%2C%224%22%3A55%2C%229%22%3A60%2C%228%22%3A 59%7D
Darf man so ein langen Text nach der Url mitschicken?
 
A

amfa

Dauergast
Ausprobieren ;)
Ich hab nicht gezählt aber google hat mir gerade verraten, dass PHP wohl eine Begrenzung auf 512 Zeichen hat für Get parameter.
PHP: $_GET - Manual

Ansonsten nutz TCPTrace, das kannst du wunderbar zwischen deine app und deinen server setzen.

mit den standardeinstellungen brauchste nur deine url ändern zu
http://localhost:8080/test.php

Wobei wichtig wäre dass du nicht https nutzt, das dürfte sonst nicht funktionieren.
Während der Entwicklung würde ich sowieso nicht https benutzen.
 
T

toomuchcoffeeman

Ambitioniertes Mitglied
Also mit Echo kann Android sehr wohl etwas anfangen, denn auf Deinen HttpRequest folgt ja mit echo der HttpResponse. Funktioniert zumindest bei mir :)

Wo ist der Teil, der die Antwort des Servers erzeugt und zurück gibt? Angenommen, der query enthält nach der DB-Abfrage Datensätze, dann machst Du doch noch was.

Ich mein: Du schreibst, dass Dein Problem die Serverantwort betrifft aber genau dieser Code fehlt :)
 
A

Anojo

Neues Mitglied
Hier ist der Rest...
Der geht deshalb hab ich ihn nicht gepostet, ich setze hin weiter oben schon mal ein und der war auch schon im Einsatz aber halt nur mit einem Wert aus der DB, jetzt sollen es 30 Werte werden, um die DB zu entlasten.


Code:
	HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent(); 
		} catch (Exception e) {
			Log.e(TAG, "Fehler bei der http Verbindung " + e.toString());
		}

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "iso-8859-1"), 8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "n");
			}
			is.close();
			result = sb.toString();


Der ursprüngliche Beitrag von 09:22 Uhr wurde um 09:56 Uhr ergänzt:


echo kommen an, Stimmt!

aber dann liegt da schon der Fehler, das meine Liste im PHP lehr ist.
 
Zuletzt bearbeitet:
T

toomuchcoffeeman

Ambitioniertes Mitglied
Ich meinte den PHP-Rest, serverseitig also...

Was meinst Du eigentlich mit "Entweder es kommt ein Fehler oder Daten" ... was für Daten? Irgendwelche oder Gewollte/Abgerufene?

Ich würde zu Debugzwecken ein echo in die Schleife einbauen, so dass Du überprüfen kannst, dass die IDs korrekt im PHP-Skript ankommen
 
A

Anojo

Neues Mitglied
Mit Fehler oder Daten hab ich gemeint das meine echo´s nicht angekommen sind...

Aber ich weiß jetzt warum, die postList kommt nicht an.
Hab ein echo eingebaut, $list ist leer.:crying:
 
T

toomuchcoffeeman

Ambitioniertes Mitglied
Hmm... wenn ich davon ausgehe, dass die Quellcodes die Originale sind... und weiter, dass Java und PHP case-sensitive sind... würde ich vermuten, dass es daran liegt, dass Du im Java-Code einen POST-Paramter names postList (großes L) erzeugst und sendest und serverseitig einen postlist (kleines L) abfragst... und dann wäre dieses zwar da (weil PHP sich um nix kümmert) aber eben leer
 
A

amfa

Dauergast
Ich glaube ich seh auch den Fehler, du setzt die Liste ja nirgendwo.
Du nutzt zwar setHttpEntity aber das ist glaub ich die falsche Methode.

Bau dir ein BasicHttpParams Objekt:
BasicHttpParams | Android Developers

und setze dort mit setParameter deine Liste rein.

Und an den Post kannst du dann mit setHttpParams das ganze anhängen.

Im moment kann dein PHP server ja gar nicht wissen was postlist sein soll, weils nirgendwo im Post gesetzt wird


Hab mich vertan wird ja scheinbar doch gesetzt, aber ja Groß-Kleinschreibung könnte das Problem sein.
 
Zuletzt bearbeitet:
A

Anojo

Neues Mitglied
Ja ist der Originale Code, hab nur hier die url veränder weil ich nicht öffentlich posten wollte wo ich es hin schicke.

Hmm echt kein plan mehr, ich versuch jetzt die Metode vom amfa und schick die jetzt über GET wenn er das in der Länge mit macht...
 
T

toomuchcoffeeman

Ambitioniertes Mitglied
Und den Schreibfehler lässt Du drin oder was? Versuch den doch erst mal zu korriegieren. Ich habe Dir doch grade erklärt, dass Du auf Grund dessen einen leeren Parameter abfragst.
 
A

Anojo

Neues Mitglied
Achso sorry, den habe ich heute morgen selber bemerkt und schon korrigiert.

Habe nicht verstanden was du damit meinst :)

hier der neue Code...

Code:
nameValuePairs.add(new BasicNameValuePair("postList", postList.toString()));
 
T

toomuchcoffeeman

Ambitioniertes Mitglied
Dann würde ich mal debuggen und mir den Rückgabewert von postList.toString() ansehen. Denn wenn der schon leer ist, hat das nichts mit der Übertragung zu tun. Dann weißt Du zumindest, dass der Fehler bei dem Erzeugen des JSON-Objektes (oder drumherum) geschieht und nichts mit der Serverantwort. Bei Fehlern Debuggen und durch den Code steppen ist immer ein genügsames Mittel :)
 
A

Anojo

Neues Mitglied
ne kann nicht sein...

hier den Inhalt vom Json...

{"19":74,"17":71,"18":73,"15":67,"16":68,"13":65,"14":66,"11":63,"12":64,"21":76,"20":75,"22":78,"23":79,"24":84,"25":103,"26":112,"27":113,"28":114,"29":118,"3":54,"2":53,"10":62,"1":34,"0":32,"7":58,"6":57,"5":56,"4":55,"9":60,"8":59}

Bin schon über zwei Tage am Debugen, die Liste geht beim senden verloren.
Bei Android geht sie raus (oder auch nicht) aber kommt nie beim PHP an oder ich finde sie da nicht mehr.
 
A

amfa

Dauergast
und im PHP steht immer noch:
$list = $_REQUEST['postlist'];
also mit kleinem L?

Wie gesagt ich empfehle dir für den Fall mal tcpDump das hängt sich als proxy dazwischen und protokolliert quasi genau das was über die Leitung geht.
Da kannst du dann sehen, ob dein Request überhaupt richtig an den Server geht.
 
A

Anojo

Neues Mitglied
Habe jetzt beide mit "postlist" und mit "postList" versucht...

Das ist das Ergebnis was zurück kommt wenn ich mir die postList zukommen lasse ist immer: NULLnNULLnfalsen

Ankommen tut definitiv nichts, hab den Code in einem PHP Forum gepostet und die wissen auch nicht warum ich ihn nicht mehr finde...

Aber dadurch weiß ich jetzt sicher das nichts ankommt.
 
T

toomuchcoffeeman

Ambitioniertes Mitglied
Die Liste geht ganz sicher nicht beim Senden verloren, denn Du benutzt doch wohl TCP... das geht aber nu zu weit.

Da Du sagtest postList ist leer, wird es wohl gar nicht erst geschickt werden. Aber beim Senden verloren gehen? Immer? Niemals.

Also -> Du schickst nicht. Oder doch? Überprüfe nicht JSON, sondern die Ausgabe von
postList.toString()