6 Stimmen

Java HttpClient ändert Inhaltstyp?

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.

7voto

waqaslam Punkte 66460

Ändern Sie dies:

StringEntity se = new StringEntity(json); 
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);

Nur zu diesem:

httppost.setEntity(new StringEntity(json.toString(), HTTP.UTF_8));

2voto

Tiago Medici Punkte 1444

Einfach:

import org.apache.http.client.methods.HttpPost;

httppost.setEntity(new StringEntity(json.toString(), org.apache.http.entity.ContentType.APPLICATION_JSON));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X