5

非常に基本的なRESTインターフェイスを使用してテキストメッセージをWebサーバーに転送するために、Androidフォン用の小さなアプリを作成しています。

私はandroid4.0.3SDKを使用しています。DjangoとDjangoのrestframeworkパッケージを使用してPythonでWebサービスを開発しました。セットアップは完全に箱から出しています。基本的に、メッセージ情報(送信者、本文、日付)を保持するJSONオブジェクトのPOSTを受信するエンドポイントが1つあります。次のコマンドでcURLを使用してサービスをテストしました。

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

これはすべて正常に機能し、期待される応答が得られます。

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

今、私はアンドロイドアプリをセットアップしました。これは、プライベートAsyncTaskクラスを含む単純なBroadcastReceiver子クラスです。

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();
    }


}

ご覧のとおり、私はJavaとAndroid SDKに慣れ始めたばかりなので、ご容赦ください。この設定は、JSON文字列をNeo4JWebサービスに送信するために作成した別のアプリで実際に正常に機能しました。

問題は、Android経由でWebサービスにメッセージを投稿すると、ある時点でコンテンツタイプが「application/json」から「application/json、application/json」に変更されることです。ヘッダーループのログエントリは、各ヘッダーの正しい値を出力しますが、Webサービスは次のエラーメッセージを返します。

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

私は困惑しています、どんな助けでも大歓迎です。

4

2 に答える 2

7

これを変える:

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

これだけに:

httppost.setEntity(new StringEntity(json.toString(), HTTP.UTF_8));
于 2012-04-21T23:33:16.320 に答える
2

簡単 :

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

httppost.setEntity(new StringEntity(json.toString(), org.apache.http.entity.ContentType.APPLICATION_JSON));
于 2019-06-03T10:52:38.310 に答える