
Micka
Fortgeschrittenes Mitglied
- 1
Hallo,
ich habe bei meinem aktuellen Projekt leider ein Paar Probleme.
Via HTTP Post möchte ich ein JSON Array vom AndroidGerät zum Server (zum testen momentan lokal xampp) schicken. Ich habe es nun auch soweit hinbekommen das alles läuft, aber nicht zufriedenstellend.
Ich muss dazu sagen PHP ist für mich noch eher Neuland.
ich versuche mal kurz zu beschreiben wie ich dabei vorgegangen bin.
In meiner APP wird ein Asynctask ausgeführt der die Synchronisation übernimmt. Der Task ruft sich selbst die lokalen sowie die auf dem Server gespeicherten Datenbanken ab. Anschließend wird dann Tabellenweise kontrolliert ob die lokale Tabelle auch online existiert. Wenn nicht wird der Name in ein Array Gespeichert. Später wird dann dann der Inhalt der lokalen Tabelle abgerufen und via HTTP zum Server übertragen.
Mein Problem momentan, ich kann nur maximal 60 (bei 69 schlägt es fehl) Zeilen aufeinmal zum Server schicken, andernfalls bekomme ich die Meldung der Header sei zu groß.
Genauer gesagt ist das hier die Antwort vom Server:
Ich bin mir nun nicht sicher ob ich das einfach so hinnehmen muss oder ob ich die Daten evtl fasch sende.
Da der gesamte Asynctask ziemlich viel Code beinhaltet (vergleich der Tabellen...) hänge ich diesen als TXT Datei an meinen post an und poste im folgenden nur die Methode, die den Insert auf dem Webserver betrifft.
an folgender Stelle übergebe ich das JSON Array dem HTTPPost, ich glaube da ist was falsch.
// Post the data:
inserthttppost.setHeader("json",postjson.toString());
// Execute HTTP Post Request
HttpResponse response = inserthttpclient.execute(inserthttppost);
Ist es richtig das Array als String in den Header zu packen?
Ich habe es auch mal anders probiert:
// Post the data:
inserthttppost.setHeader("json",json.toString());
inserthttppost.getParams().setParameter("jsonpost",postjson);
// Execute HTTP Post Request
System.out.print(json);
HttpResponse response = httpclient.execute(inserthttppost);
Diese Methode wirft zwar keine Fehler, aber ich habe es so nicht geschafft das JSON Array mittels PHP anzunehmen, evtl mache ich auch da etwas falsch.
Wer bis hierhin gelesen hat verdient alleine dafür schonmal ein fettes Dankeschön. Ich hoffe ihr könnt mir helfen, da die Performance mit 60Zeilen pro http Post doch eher mies ist.
ich habe bei meinem aktuellen Projekt leider ein Paar Probleme.
Via HTTP Post möchte ich ein JSON Array vom AndroidGerät zum Server (zum testen momentan lokal xampp) schicken. Ich habe es nun auch soweit hinbekommen das alles läuft, aber nicht zufriedenstellend.
Ich muss dazu sagen PHP ist für mich noch eher Neuland.
ich versuche mal kurz zu beschreiben wie ich dabei vorgegangen bin.
In meiner APP wird ein Asynctask ausgeführt der die Synchronisation übernimmt. Der Task ruft sich selbst die lokalen sowie die auf dem Server gespeicherten Datenbanken ab. Anschließend wird dann Tabellenweise kontrolliert ob die lokale Tabelle auch online existiert. Wenn nicht wird der Name in ein Array Gespeichert. Später wird dann dann der Inhalt der lokalen Tabelle abgerufen und via HTTP zum Server übertragen.
Mein Problem momentan, ich kann nur maximal 60 (bei 69 schlägt es fehl) Zeilen aufeinmal zum Server schicken, andernfalls bekomme ich die Meldung der Header sei zu groß.
Genauer gesagt ist das hier die Antwort vom Server:
Code:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Size of a request header field exceeds server limit.<br />
<pre>
json
</pre>
</p>
<hr>
<address>Apache/2.4.12 (Win32) OpenSSL/1.0.1m PHP/5.6.11 Server at localhost Port 80</address>
</body></html>
Ich bin mir nun nicht sicher ob ich das einfach so hinnehmen muss oder ob ich die Daten evtl fasch sende.
Da der gesamte Asynctask ziemlich viel Code beinhaltet (vergleich der Tabellen...) hänge ich diesen als TXT Datei an meinen post an und poste im folgenden nur die Methode, die den Insert auf dem Webserver betrifft.
Code:
private String insertInTable(ArrayList<Data> insert2DataList) throws JSONException
{
String insertPhpResponse="";
// Insert Data to Table
JSONObject json;
JSONArray postjson=new JSONArray();
HttpClient inserthttpclient = new DefaultHttpClient();
//HttpPost inserthttppost = new HttpPost("http://192.168.192.34/SyncTableToServerBackup.php");
HttpPost inserthttppost = new HttpPost("http://192.168.192.34/SyncTableToServer.php");
try
{
// JSON data:
Data data;
for(int i = 0; i < insert2DataList.size(); i++)
{
json = new JSONObject();
data = insert2DataList.get(i);
int value1 = Integer.parseInt(data.getvalue1String(), 2);
int value2 = Integer.parseInt(data.getvalue2(), 2);
int value3 = Integer.parseInt(data.getvalue3(), 2);
int value4 = Integer.parseInt(data.getvalue4(), 2);
int value5 = Integer.parseInt(data.getvalue5String(), 2);
String DATA = data.getDataHex();
json.put("value1", value1);
json.put("value2", value2);
json.put("value3", value3);
json.put("value4", value4);
json.put("value5", value5);
json.put("data", DATA);
json.put("tablename", this.tablename);
postjson.put(i, json);
}
// Post the data:
inserthttppost.setHeader("json",postjson.toString());
// Execute HTTP Post Request
HttpResponse response = inserthttpclient.execute(inserthttppost);
// for JSON:
/*if(response != null)
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) ");
InputStream is = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try ");
while ((line = reader.readLine()) != null)
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try -while");
sb.append(line + "\n");
}
} catch (IOException e)
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try -catch (IOException e)");
insertPhpResponse ="EXCEPTION";
e.printStackTrace();
} finally
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try -finally");
try
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try -finally -try");
is.close();
} catch (IOException e)
{
//Log.i(LOGTAG, "SyncTableToServerTask - insertInTable() - postData() - if(response != null) - try -finally -catch (IOException e)");
insertPhpResponse ="EXCEPTION";
e.printStackTrace();
}
}
insertPhpResponse = insertPhpResponse + sb.toString();
}*/
}catch (ClientProtocolException e)
{
insertPhpResponse ="EXCEPTION";
// TODO Auto-generated catch block
} catch (IOException e)
{
insertPhpResponse ="EXCEPTION";
// TODO Auto-generated catch block
}
Log.i(LOGTAG, "INSERTINTABLE ENDE");
return insertPhpResponse;
}
}
an folgender Stelle übergebe ich das JSON Array dem HTTPPost, ich glaube da ist was falsch.
// Post the data:
inserthttppost.setHeader("json",postjson.toString());
// Execute HTTP Post Request
HttpResponse response = inserthttpclient.execute(inserthttppost);
Ist es richtig das Array als String in den Header zu packen?
Ich habe es auch mal anders probiert:
// Post the data:
inserthttppost.setHeader("json",json.toString());
inserthttppost.getParams().setParameter("jsonpost",postjson);
// Execute HTTP Post Request
System.out.print(json);
HttpResponse response = httpclient.execute(inserthttppost);
Diese Methode wirft zwar keine Fehler, aber ich habe es so nicht geschafft das JSON Array mittels PHP anzunehmen, evtl mache ich auch da etwas falsch.
Wer bis hierhin gelesen hat verdient alleine dafür schonmal ein fettes Dankeschön. Ich hoffe ihr könnt mir helfen, da die Performance mit 60Zeilen pro http Post doch eher mies ist.