HttpGet - 奇怪的编码/字符

时间:2011-07-03 11:06:00

标签: android encoding http-get

我有以下课程

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

     

Content-Type:application / json;

     

的charset = UTF-8

     

内容编码:gzip

     

服务器:Microsoft-IIS / 7.5

     

X-AspNetMvc-Version:3.0

     

X-AspNet-Version:4.0.30319

     

X-Powered-By:ASP.NET

     

日期:太阳,03

     

2011年7月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 个答案:

答案 0 :(得分:3)

问题在于:

Content-Encoding: gzip

这意味着您获得的奇怪字符是预期JSON的gzip压缩版本。您的浏览器会进行解压缩,因此您可以看到解码结果。您应该查看您的请求标题和服务器配置。

答案 1 :(得分:3)

嗯,gzip编码通常是一种很好的做法 - 对于JSON数据(尤其是大数据),它实际上可以使传输的数据量减少10倍到20倍(这是一件好事)。所以更好的是让HttpClient很好地处理GZIP压缩。例如:

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

顺便说一句。然而,当客户端没有说“Accept-Encoding:gzip”时,在服务器端提供GZIP压缩数据似乎是错误的,这似乎就是这种情况......所以有些事情也必须在服务器上纠正。上面的示例为您添加了Accept-Encoding标头。