Android HttpGet-奇怪的编码/字符
我有一节以下的课Android HttpGet-奇怪的编码/字符,android,encoding,http-get,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 Ht
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;
}
}
还有一个web服务,响应头是(由于隐私问题,我无法提供直接链接)
状态:HTTP/1.1200
确定缓存控制:专用
内容类型:application/json
字符集=utf-8
内容编码:gzip
服务器:Microsoft IIS/7.5
X-AspNetMvc-Version:3.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
日期:2003年3月3日星期日
2011年7月11:00:43格林尼治标准时间
连接:关闭
内容长度:8134
最后,我得到了一系列奇怪的、不可读的字符(我应该像在普通桌面浏览器中一样得到常规的JSON)
问题出在哪里?(同样的代码在ex.google.com上运行得很好,我得到了很好的结果)
编辑:解决方案(请参见下面的说明)
替换
与
替换
stream = response.getEntity().getContent();
与
问题在于:
Content-Encoding: gzip
这意味着您得到的奇怪字符是预期JSON的gzip压缩版本。您的浏览器执行解压缩,以便在那里看到解码结果。您应该查看您的请求头和服务器的配置。问题在于:
Content-Encoding: gzip
这意味着您得到的奇怪字符是预期JSON的gzip压缩版本。您的浏览器执行解压缩,以便在那里看到解码结果。您应该看看您的请求头和服务器的配置。好吧,gzip编码通常是一种很好的做法-对于JSON数据(尤其是大数据),它实际上可以将要传输的数据量减少10到20倍(这是一件好事)。。所以最好让HttpClient很好地处理GZIP压缩。例如:
顺便说一句,在服务器端,当客户端没有说“接受编码:GZIP”时,提供GZIP压缩数据似乎是错误的,这似乎是这样的。。。因此,有些事情也必须在服务器上进行纠正。上面的示例为您添加了Accept Encoding头。好吧,gzip编码通常是一种好的做法——对于JSON数据(尤其是大数据),它实际上可以将要传输的数据量减少10到20倍(这是一件好事)。。所以最好让HttpClient很好地处理GZIP压缩。例如:
顺便说一句,在服务器端,当客户端没有说“接受编码:GZIP”时,提供GZIP压缩数据似乎是错误的,这似乎是这样的。。。因此,有些事情也必须在服务器上进行纠正。上面的示例为您添加了Accept Encoding标头。太好了!我忽略了那个。谢谢;)伟大的我忽略了那个。谢谢;)
stream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
stream = new GZIPInputStream(stream);
}
Content-Encoding: gzip