Ich baue eine kleine App für mein Android-Telefon, um Textnachrichten über eine sehr einfache REST-Schnittstelle an einen Webserver weiterzuleiten.
Ich verwende das Android 4.0.3 SDK. Ich habe den Webservice in Python mit Django und dem Django Restframework Paket entwickelt. Das Setup ist komplett "out of the box". Es gibt im Grunde einen Endpunkt, der ein POST eines JSON-Objekts mit den Nachrichteninformationen (Absender, Text, Datum) empfängt. Ich habe den Dienst mit cURL mit dem folgenden Befehl getestet:
curl -X POST -H 'Content-Type: application/json' --data '{"sender":"+xxxxxxxx", "body": "test", "send_date":"2011-03-20 16:32:02"}' http://[...]/messages.json
Das alles funktioniert einwandfrei, und ich erhalte die erwartete Antwort:
{"body": "test", "send_date": "2011-03-20T16:32:02", "id": 25, "sender": "+xxxxxxxxxx"}
Jetzt habe ich die Android-App eingerichtet. Es ist eine einfache BroadcastReceiver-Unterklasse, die eine private AsyncTask-Klasse enthält:
private class httpPost extends AsyncTask<String, Void, JSONObject> {
protected JSONObject doInBackground(String... args) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
String url = args[0];
String json=args[1];
JSONObject JSONResponse = null;
InputStream contentStream = null;
String resultString = "";
try {
HttpPost httppost = new HttpPost(url);
httppost.setHeader("Content-Type", "application/json");
httppost.setHeader("Accept", "application/json");
StringEntity se = new StringEntity(json);
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);
for (int i=0;i<httppost.getAllHeaders().length;i++) {
Log.v("set header", httppost.getAllHeaders()[i].getValue());
}
HttpResponse response = httpclient.execute(httppost);
// Do some checks to make sure that the request was processed properly
Header[] headers = response.getAllHeaders();
HttpEntity entity = response.getEntity();
contentStream = entity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(contentStream,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
contentStream.close();
resultString = sb.toString();
}catch(Exception e){
e.printStackTrace();
}
Log.v("log", resultString);
return new JSONObject();
}
}
Wie Sie sehen, fange ich gerade erst an, mich mit Java und dem Android SDK vertraut zu machen, also haben Sie bitte Geduld mit mir. Dieses Setup hat in einer anderen App, die ich zum Senden von JSON-Strings an einen Neo4J-Webservice erstellt habe, gut funktioniert.
Das Problem ist, dass, wenn ich die Nachricht über Android an meinen Webservice sende, irgendwann der Inhaltstyp von "application/json" in "application/json, application/json" geändert wird. Der Protokolleintrag in der Header-Schleife gibt immer noch die richtigen Werte für jeden Header aus, aber der Webservice gibt diese Fehlermeldung zurück:
{"error": "Unsupported media type in request 'application/json, application/json'."}
Ich bin verwirrt, jede Hilfe ist willkommen.