我有以下课程
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);
}
答案 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标头。