HttpGet - странная кодировка / символы - PullRequest
0 голосов
/ 03 июля 2011

У меня есть следующий класс

public class MyHttpClient {
private static HttpClient httpClient = null;

public static HttpClient getHttpClient() {
    if (httpClient == null)
        httpClient = new DefaultHttpClient();

    return httpClient;
}

public static String HttpGetRequest(String url) throws IOException {
    HttpGet request = new HttpGet(url);
    HttpResponse response = null;
    InputStream stream = null;

    String result = "";
    try {
        response = getHttpClient().execute(request);
        if (response.getStatusLine().getStatusCode() != 200)
            response = null;
        else
            stream = response.getEntity().getContent();

            String line = "";
            StringBuilder total = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(stream));
            while ((line = rd.readLine()) != null) { 
                total.append(line); 
            }

            // Return full string
            result = total.toString();
    } catch (ClientProtocolException e) {
        response = null;
        stream = null;
        result = null;
    } catch (IllegalStateException e) {
        response = null;
        stream = null;
        result = null;
    }

    return result;
}
}

и веб-сервис, который заголовок ответа равен (я не могу предоставить прямую ссылку из-за конфиденциальности)

Статус: HTTP / 1.1 200

OK Cache-Control: private

Тип содержимого: application / json;

charset = utf-8

Кодировка содержимого: gzip

Сервер: Microsoft-IIS / 7.5

X-AspNetMvc-версия: 3.0

X-AspNet-версия: 4.0.30319

X-Powered-By: ASP.NET

Дата: вс, 03

Июл 2011 11:00:43 GMT

Соединение: закрыть

Длина содержимого: 8134

В итоге я получаю в результате серию странных, нечитаемых символов (я должен получить обычные JSON как в обычном браузере на рабочем столе).

В чем проблема? (тот же код для ex. Google.com работает отлично, и я получаю хорошийрезультат)

РЕДАКТИРОВАТЬ: Решение (см. описание ниже)Замените

HttpGet request = new HttpGet(url);

на

HttpUriRequest request = new HttpGet(url);
request.addHeader("Accept-Encoding", "gzip");

и замените

stream = response.getEntity().getContent();

на

stream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
    stream = new GZIPInputStream(stream);
}

Ответы [ 2 ]

3 голосов
/ 03 июля 2011

Что ж, кодирование gzip, как правило, является хорошей практикой - для данных JSON (особенно больших) фактически может быть получено уменьшение объема передаваемых данных в 10–20 раз (что ХОРОШО). Поэтому лучше дать HttpClient прекрасно справляется со сжатием GZIP. Например здесь:

http://forrst.com/posts/Enabling_GZip_compression_with_HttpClient-u0X

КСТАТИ. Однако на стороне сервера кажется неправильным предоставлять сжатые данные GZIP, когда клиент не говорит «Accept-Encoding: gzip», что, похоже, имеет место ... Поэтому некоторые вещи также должны быть исправлены на сервере. В приведенном выше примере для вас добавлен заголовок Accept-Encoding.

3 голосов
/ 03 июля 2011

Проблема здесь:

Content-Encoding: gzip

Это означает, что странные символы, которые вы получаете, представляют собой сжатую gzip версию ожидаемого JSON. Ваш браузер выполняет декомпрессию, поэтому вы видите декодированный результат. Вы должны взглянуть на заголовок вашего запроса и на конфигурацию вашего сервера.

...