1

Android用にプログラミングしてからしばらく経ちましたが、問題が発生しているコードが含まれていた以前の作業をすべて失いました。同じサーバーに接続してデータをダウンロードする Android と iPhone の両方のアプリを開発しています。iPhone 版ではすべて問題ありませんが、Android では、サーバーで実行したいメソッド名を含む投稿データをサーバーにヒットすると、データがリクエストに追加されないようです。

Android ではこのリクエストで POST が機能しないのに、アプリの iPhone バージョンでは機能するのはなぜですか?

私が使用しているコードは次のとおりです。

public static void makeRequest() throws Exception {
    Thread t = new Thread() {
        public void run() {
            Looper.prepare(); //For Preparing Message Pool for the child Thread
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
            HttpResponse response;
            HttpEntity entity;
            JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://divisi.co.uk/rest/requesthandler.php");
                json.put("method", "getEventListData");

                StringEntity se = new StringEntity(json.toString());  
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);

                response = client.execute(post);

                entity = response.getEntity();

                String retSrc = EntityUtils.toString(entity); 

                JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object
                if(result.getString("SC") == "200"){
                    JSONArray data = result.getJSONArray("data");
                }
                else{

                }

            } catch(Exception e) {
                e.printStackTrace();
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}

サーバーからの応答は次のとおりです。

{"data":{"scalar":""},"SC":405,"timestamp":1363788265}

メソッド名が見つからなかったことを意味します。つまり、サーバーへのリクエストに投稿されていません。

4

5 に答える 5

2

私がこのようなことをする方法の例をここに示します:

HttpClient httpClient = new DefaultHttpClient();

HttpPost postRequest = new HttpPost("http://divisi.co.uk/rest/requesthandler.php");
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart(new FormBodyPart("method", new StringBody("getEventListData")));
reqEntity.addPart(new FormBodyPart("NEED_A_KEY_HERE", new StringBody("" + json.toString())));

postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
JSONObject responseDict = new JSONObject(EntityUtils.toString(response.getEntity()));
于 2013-04-11T15:22:25.027 に答える
1

POST 本文を設定するコードは問題ないかもしれません。Web サービスに問題がある可能性があると思います。Rested や curl などを使用して、サーバーへの呼び出しを手動で行ってみてください。POST本文の有無を含め、あなたが行っているのとまったく同じリクエストを行いましたが、サーバーから同じ応答を受け取りました。

{"data":{"scalar":""},"SC":405,"timestamp":1365704082}

あなたをつまずかせるかもしれないいくつかのこと:

JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object
if(result.getString("SC") == "200"){
    JSONArray data = result.getJSONArray("data");
}

ここでは、 を使用して文字列 "405" を "200" と比較していますが、==最初に null チェックを行ってから.equals("200")代わりに を使用する必要があります。または、result.getInt("SC") == 200これは応答 JSON の整数型であるため、使用します。

また、サーバーの応答からの「データ」エンティティは、実際には JSON 配列として返されません。getJSONObject("data")代わりに使用する必要があります。

さらに、文字列を外部化することは常に良い考えです。

コードは次のようになります。

public static final String JSON_KEY_SC = "SC";
public static final String JSON_KEY_DATA = "data";

...

JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object

String sc = result.getString(JSON_KEY_SC);
if (sc != null && sc.equals("200")) {
    JSONObject data = result.getJSONObject(JSON_KEY_DATA);
}
else {
    ...
}
于 2013-04-11T18:33:51.213 に答える
1

サーバー側でフィドラーを使用します。http メッセージが正しいかどうかを確認します。サーバー側の問題のようです。json を受信して​​解析するサーバー側のコードを教えてください。

于 2013-04-11T07:36:32.020 に答える