这来自SO 上的答案
至于GZIP压缩,你不应该自己做。让服务器自己操作。
修复您的代码以删除所有手动压缩响应的尝试,它应该最终基本上看起来像这样:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String json = createItSomehow();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
下面是Apache Tomcat 7 HTTP连接器的配置页面
压缩
连接器可能使用HTTP/1.1 GZIP压缩来尝试保存服务器带宽。参数的可接受值为"关闭"(禁用压缩),"on"(允许压缩,这会导致文本数据被压缩)、"力"(在所有情况下都强制压缩)或数值整数值(相当于"on",但指定压缩输出之前的最小数据量)。如果内容长度未知,压缩设置为"开"或更大侵略性,输出也会被压缩。如果未指定,则属性设置为"关闭"。
压缩最小大小
如果压缩设置为"on",则此属性可用于指定压缩输出之前的最小数据量。如果未指定,此属性默认为"2048"
这意味着当压缩设置为on时。只有当数据大于2084时,才会对其进行压缩。
在我的Android客户端中,我使用以下代码来查找数据是否是gzip压缩的或不是
if ( entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
我的问题
服务器在压缩数据时是否也设置了entity.getContentEncoding().getValue()
的值?
服务器对android应用程序中的entity
一无所知。如果使用gzip,Tomcat的连接器将适当地设置Content-Encoding
响应标头。
此外,你的代码比它需要的更复杂。你可以这样做:
if ( "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
因为没有机会获得NPE。