Java-HttpClient ändern der content-type?

Baue ich eine kleine app für mein Android-Handy zum weiterleiten von SMS-Nachrichten an einen webserver über eine sehr einfache REST-Schnittstelle.

Ich bin mit dem android 4.0.3 SDK. Ich entwickelte einen webservice in python mit dem Django und Django restframework Paket. Die Einrichtung ist komplett aus der box. Es ist im Grunde ein Endpunkt, der erhält POST von einem JSON-Objekt hält die Nachricht info (Absender, body, Datum). Ich habe den service getestet mit cURL mit dem folgenden Befehl:

curl -X POST -H 'Content-Type: application/json' --data '{"sender":"+xxxxxxxx", "body": "test", "send_date":"2011-03-20 16:32:02"}' http://[...]/messages.json

Diesem alles Prima funktioniert und ich bekomme die erwartete Antwort:

{"body": "test", "send_date": "2011-03-20T16:32:02", "id": 25, "sender": "+xxxxxxxxxx"}

Nun richte ich die android app. Es ist eine einfache BroadcastReceiver Kind Klasse mit einem eigenen AsyncTask-Klasse:

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 können ich bin gerade erst anfangen, machen Sie sich vertraut mit Java und dem android SDK, also bitte Geduld mit mir. Dieses setup tatsächlich geklappt, in einem anderen app, die ich Baue, schicken JSON-strings zu einer Neo4J-webservice.

Das problem ist, dass wenn ich nach der Nachricht über Android auf meinem webservice, irgendwann wird der content-Typ geändert von 'application/json' , 'application/json, application/json'. Der log-Eintrag in der Header-Schleife noch Ausgänge die richtigen Werte für jede Kopfzeile, jedoch die webservice, wird diese Fehlermeldung angezeigt:

{"error": "Unsupported media type in request 'application/json, application/json'."}

Ich bin ratlos, jede Hilfe ist willkommen.

Warum schreibst du zwei "Content-Type" - Header? Einmal mit http.setHeader und die anderen durch die Einheiten. Vielleicht ist es die Ursache des Fehlers.
Soweit ich verstanden habe, die zweite (bei der StringEntity) ist lediglich um die Entschlüsselung der Person und berührt nicht die post-Header. Ich getestet habe dies nicht durch das hinzufügen der post-header. In diesem Fall ist der header, der landete in der Anfrage war der standard-text/plain-header.
Nicht zu sagen, ich bin sicher, aber ich würde versuchen, ohne die Einheit. Abgesehen davon, dass ein HTTP-sniffer (wie wireshark) kann Ihnen helfen, zu diagnostizieren, wenn der Fehler auf dem client oder dem server.
Download von wireshark nun sehen, was das bringt. Vielen Dank für die Zeiger

InformationsquelleAutor Bart | 2012-04-21

Schreibe einen Kommentar