DefaultHttpClient изменить размер ответа? - PullRequest
2 голосов
/ 08 февраля 2012

Что я пытаюсь сделать


Здравствуйте, ребята, я пытаюсь создать приложение, в котором я могу просматривать заказы, которые мне дали клиенты. Для этого я создал интерфейс на своем сервере, на котором я могу отправлять запросы post / get / set. Ответ Сервера находится в JSON-формате. (Для вашей информации банкомат заполняется только dummydata)

Теперь, когда я делаю запрос get из моего приложения на сервер, я получаю от него ответ, но он не завершен, ведь половина ответа, которую я должен получить, отсутствует! :( Но когда я открываю URL с запросом Get в моем браузере, я получаю полный ответ.

Вопрос


Как вы видите, это не может быть проблема на сервере, потому что я также попытался через 'curl' сделать это, чтобы получить запрос, и всегда получал полный ответ.

В моем приложении я работаю с DefaultHttpClient, поэтому я решил, что проблема может заключаться в том, что для ответа есть предел, но я его не нашел.

Так, где я могу изменить этот "размер ответа" и что еще может быть проблемой, почему я не получаю полный ответ! Несколько хороших фрагментов кода или что-нибудь еще, что вы можете себе представить, помогут!

Здесь вы найдете код метода, который выполняет запрос Get.

Код


Если вам нужно больше кода, просто напишите его в комментариях!

(getOrders) 1030 * *


public void getOrders() {
        Log.d("DataHandlerService", "Aufträge werden geladen");
        Thread t = new Thread() {
            public void run() {

                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                String userid = settings.getString("userid", "uid");


                Log.d("DataHandlerService", userid);

                // Download-URL
                String URL = "http://api.i-v-o.ch/users/" + userid
                        + "/assignments.json";
                Log.d("Request-URL", URL);

                DefaultHttpClient client = new DefaultHttpClient();
                HttpResponse response;

                try {
                    HttpGet request = new HttpGet();
                    request.setURI(new URI(URL));
                    request.addHeader("Content-Type",
                            "application/x-www-form-urlencoded");
                    response = client.execute(request);


                    int statuscode = response.getStatusLine().getStatusCode();
                    switch (statuscode) {

                    case 200:

                        if (response != null) {

                            StringBuilder sb = new StringBuilder();
                            BufferedReader rd = new BufferedReader(
                                    new InputStreamReader(response.getEntity()
                                            .getContent()));

                            String line;
                            while ((line = rd.readLine()) != null) {
                                sb.append(line + "\n");
                            }
                            String result;
                            result = sb.toString();
                            Log.d("Response", result);
                            JSONReader(result); //here the json will be generated
                        }

                        break;

                    case 500:
                        // Error-Handling
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("DataHandler", "URLConnection-Error" + e);
                }

            }
        };
        t.start();
    }

Вот ответ, который вы просили, как будто вы видите, что его не существует!

[{"created_at":"2012-01-06T17:10:00Z","end_datetime":"2008-03-25T13:00:00Z","id":2127,"start_datetime":"2008-03-25T13:00:00Z","updated_at":"2012-01-06T17:10:00Z","title":"2127 Foobar","referee_forename":"Peter","referee_surname":"Gertsch","referee_full_name":"Peter Gertsch","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:03Z","end_datetime":"2008-04-04T12:00:00Z","id":2134,"start_datetime":"2008-04-04T12:00:00Z","updated_at":"2012-01-06T17:10:03Z","title":"2134 Foobar","referee_forename":"Daniel","referee_surname":"Brunner","referee_full_name":"Daniel Brunner","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:03Z","end_datetime":"2008-04-07T12:00:00Z","id":2136,"start_datetime":"2008-04-07T12:00:00Z","updated_at":"2012-01-06T17:10:03Z","title":"2136 Foobar","referee_forename":"Andreas","referee_surname":"Lutz","referee_full_name":"Andreas Lutz","category_title":"Installation - SAT","status_title":"Closed - technisches problem"},{"created_at":"2012-01-06T17:10:08Z","end_datetime":"2008-05-22T07:00:00Z","id":2144,"start_datetime":"2008-05-22T07:00:00Z","updated_at":"2012-01-06T17:10:08Z","title":"2144 Foobar","referee_forename":"Pascal","referee_surname":"Pichand","referee_full_name":"Pascal Pichand","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:08Z","end_datetime":"2008-05-15T07:00:00Z","id":2145,"start_datetime":"2008-05-15T07:00:00Z","updated_at":"2012-01-06T17:10:08Z","title":"2145 Foobar","referee_forename":"Hansruedi","referee_surname":"W\u00fcrgler","referee_full_name":"Hansruedi W\u00fcrgler","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:08Z","end_datetime":"2008-05-26T08:00:00Z","id":2146,"start_datetime":"2008-05-26T08:00:00Z","updated_at":"2012-01-06T17:10:08Z","title":"2146 Foobar","referee_forename":"Martina","referee_surname":"Issler","referee_full_name":"Martina Issler","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:08Z","end_datetime":"2008-06-03T14:00:00Z","id":2147,"start_datetime":"2008-06-03T14:00:00Z","updated_at":"2012-01-06T17:10:08Z","title":"2147 Foobar","referee_forename":"Matthias ","referee_surname":"Kuhn","referee_full_name":"Matthias  Kuhn","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:12Z","end_datetime":"2008-07-07T07:00:00Z","id":2157,"start_datetime":"2008-07-07T07:00:00Z","updated_at":"2012-01-06T17:10:12Z","title":"2157 Foobar","referee_forename":"Eberhard","referee_surname":"Polatzek","referee_full_name":"Eberhard Polatzek","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:13Z","end_datetime":"2008-07-11T08:00:00Z","id":2161,"start_datetime":"2008-07-11T08:00:00Z","updated_at":"2012-01-06T17:10:13Z","title":"2161 Foobar","referee_forename":"Magali","referee_surname":"Bohin","referee_full_name":"Magali Bohin","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:14Z","end_datetime":"2008-07-25T08:30:00Z","id":2163,"start_datetime":"2008-07-25T08:30:00Z","updated_at":"2012-01-06T17:10:14Z","title":"2163 Foobar","referee_forename":"(Hotel Centrum Griesalp)","referee_surname":"Haltenegg Betriebs AG","referee_full_name":"(Hotel Centrum Griesalp) Haltenegg Betriebs AG","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:16Z","end_datetime":"2008-08-07T09:00:00Z","id":2170,"start_datetime":"2008-08-07T09:00:00Z","updated_at":"2012-01-06T17:10:16Z","title":"2170 Foobar","referee_forename":".","referee_surname":"SAC Hollandiah\u00fctte","referee_full_name":". SAC Hollandiah\u00fctte","category_title":"Installation - SAT","status_title":"Closed - Erfolgreich"},{"created_at":"2012-01-06T17:10:16Z","end_datetime":"2009-05-07T06:30:00Z","i

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Ах. Правильно, проблема не в вашей связи или чем-то подобном. Ваш сервис возвращает массив - , а не объект - таким образом, вы должны проанализировать его следующим образом:

HttpResponse response = ...
if (.. validate status ..) {
    JSONArray array = new JSONArray(HttpEntityUtils.toString(response.getEntity()));
    // Your JSONArray is now ready to play with.
}

И рассмотрите возможность использования AsyncTask вместо Thread, например:

class AssignmentsTask extends AsyncTask<String, Void, JSONArray> {
    @Override
    protected JSONArray doInBackground(String... params) {
        final String url = "http://api.i-v-o.ch/users/" + params[0]
                + "/assignments.json";
        try {
            HttpResponse response = mClient.execute(new HttpGet(url));
            if (response.getStatusLine().getStatusCode() == 200) {
                return new JSONArray(EntityUtils.toString(response.getEntity()));
            } else {
                Log.w(TAG, "Error receiving assignments for " + params[0] + ", " + response.getStatusLine());
            }
        } catch (ClientProtocolException e) {
            Log.w(TAG, "Proto: Error fetching assignments for " + params[0], e);
        } catch (IOException e) {
            e.printStackTrace();
            Log.w(TAG, "IO: Error reading assignments for " + params[0], e);
        } catch (ParseException e) {
            Log.w(TAG, "Parse: Error parsing assignments for " + params[0], e);
        } catch (JSONException e) {
            Log.w(TAG, "JSON: Error parsing JSON for " + params[0], e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(JSONArray result) {
        // Stuff that handles the resulting JSONObject on
        // the UI-thread goes here (i.e. update View:s)

        // result is null if the operation failed
    }
}

А для получения заказа для пользователя «116»:

new AssignmentsTask().execute("116");
0 голосов
/ 08 февраля 2012

Размер ответа должен указывать веб-сервер, с которым вы связываетесь.Вы можете прочитать размер ответа , используя :

httpResponse.getEntity().getContentLength()

Кроме того, может произойти тайм-аут соединения, из-за которого клиент не сможет получить все данные ответа.В этом случае попробуйте , используя достаточно большое время ожидания , чтобы убедиться, что вы получите все данные.

Если ваш json слишком большой, то в мобильном контексте не стоит ожидать, что все данные поступают в одном запросе, тогда вам может потребоваться разработать веб-сервер, который может дать вам кускиВ ответ на запрос вам потребуется первый блок, затем другой, и т. д.

Обычно частичное содержание http-протокола является решением этой проблемы.

...