Успели ли какие-либо разработчики Android получить протокол передачи фрагментированных данных от веб-службы? - PullRequest
9 голосов
/ 20 февраля 2011

Я боролся с несколькими реализациями классов, чтобы получить фрагментированные данные без успеха.Ниже приведен упрощенный модуль кода, который имеет проблему.После просмотра веб-страниц, похоже, в прошлом были проблемы (2009, 2010; версия 1.1, 1.5), но они должны быть решены к настоящему времени.Я не видел какого-либо определенного успеха с платформой Android для этого протокола.

Справка!

Я могу увидеть какой-либо ответ, если добавлю недопустимый токен - веб-служба ответит с помощьюсообщение об ошибке приложения.Однако действительные URL и токен просто ответят обнаружением протокола chunked (isChunked () возвращает true), но ничего не читается и ничего не истекает, и т. Д.

Точно такой же URL-адрес, выданный CURLиз командной строки работает, как и ожидалось, и отображает непрерывный контент (опубликованные данные из веб-службы).

Есть ли какие-либо взломы на стороне веб-службы, например, добавление дополнительных концов строк для принудительного получения потока приема ??

                URI uri;
                try {
                    uri = new URI("http://cws.mycompany.com/service/events?accesskeyid=8226f3ddc65a420abc391d8f1fe12de44766146762_1298174060748");
                    HttpClient httpClient=new DefaultHttpClient(); 
                    HttpGet httpGet=new HttpGet(uri); 
                    ResponseHandler<String> rh=new BasicResponseHandler(); 
                    String responseString=httpClient.execute(httpGet,rh); 
                    Log.d(TAG, "response as string:\n" + responseString);
                } catch (URISyntaxException e) {
                    Log.e(TAG, e.toString());
                    e.printStackTrace();
                } catch (ClientProtocolException e) {
                    Log.e(TAG, e.toString());
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.e(TAG, e.toString());
                    e.printStackTrace();
                }

1 Ответ

9 голосов
/ 28 февраля 2011

Я протестировал код, который вы написали на моем эмуляторе с Android 2.2, и он отлично работает. URL-адрес, который я использовал, был:

        uri = new URI("http://www.httpwatch.com/httpgallery/chunked/");

Я заметил, что BasicResponseHandler продолжает пытаться читать, пока не достигнет конца потока, и возвращает все данные целиком. Код может зависнуть в ожидании закрытия потока. Ваш веб-сервис заканчивает поток? или он продолжает возвращать куски навсегда? Я не вижу способа вернуть только первый чанк, но я написал простой обработчик, который просто читает первое чтение из входного потока (который при условии достаточно большого буфера соответствует чанку). В случае URI, который я использовал для тестирования, он возвращает каждую строку файла HTML в виде фрагмента. Вы можете видеть только первый, возвращенный сюда.

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

public class ChunkedResponseHandler implements ResponseHandler<String> {
    public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {

        HttpEntity entity = response.getEntity();
        InputStream in = entity.getContent();
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        int n =  in.read(b);
        out.append(new String(b, 0, n));        
        return out.toString();
    }
}
...