至于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压缩,以节省服务器带宽。该参数的可接受值为“ off”(禁用压缩),“ on”(允许压缩,这将导致压缩文本数据),“ force”(在所有情况下均强制压缩)或数字整数值(即等效于“ on”,但指定压缩输出之前的最小数据量。如果内容长度未知,并且压缩设置为“ on”或更具攻击性,则输出也将被压缩。如果未指定,则此属性设置为“ off”。
compressionMinSize
如果压缩设置为“ on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,则此属性默认为“ 2048”
这意味着压缩设置为开时。仅当数据大于2084时才会压缩。
在我的Android客户端中,我正在使用以下代码查找数据是否经过gzip压缩
if ( entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
我的问题
服务器entity.getContentEncoding().getValue()在压缩数据时是否还会设置的值?
entity.getContentEncoding().getValue()
服务器对entity您的android应用中的内容一无所知。Content-Encoding如果使用gzip,则Tomcat的连接器将适当地设置响应头。
entity
Content-Encoding
另外,您的代码比需要的要复杂。您可以这样做:
if ( "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
…因为没有NPE的机会。